繁体   English   中英

php readdir问题与日语文件名

[英]php readdir problem with japanese language file name

我有以下代码

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo $file."<br />\n";
        }
    }
    closedir($handle);
}
?>

当它确实有像日语这样的mb语言时,它不能正常显示而是显示像kyuukyoku Choujin R ?????~? 而不是kyuukyoku Choujin R研极极人あ〜る

无论如何要让它显示正确的名称或使其仍可由其他人下载?

谢谢你帮助我:)

我不能肯定地说PHP,但我怀疑它与Python 2的基本问题相同(之前添加了对Unicode字符串文件名的特殊支持)。

我相信PHP正在使用标准C库'open'-et-al函数来处理文件名,这些函数是基于字节的。 在Windows(NT)上,这些尝试使用系统代码页对真实的Unicode文件名进行编码。 这可能是西方机器的cp1252(类似于ISO-8859-1),或日本机器上的cp932(类似于Shift-JIS)。 对于系统代码页中不存在的任何字符,您将获得“?” 字符,你将无法引用该文件。

为了解决这个问题,PHP必须像Python 3.0一样开始使用Unicode字符串作为文件名(以及其他所有内容),使用'_wopen'-et-al函数来获取Windows下文件名的本机Unicode访问。 我希望这会发生在PHP6中,但目前你可能已经填满了。 您可以将系统代码页更改为cp932以访问文件名,但您仍然可以获得'?' 其他任何Unicode字符的字符不是在按住Shift JIS,在任何情况下,你真的不想让你的应用程序的内部串所有的移位,JIS,因为它是一个相当可怕的编码。

如果你自己的脚本选择如何存储文件,我强烈建议在本地使用简单的基于主键的文件名,如'4356',将真实的文件名放在数据库中,并使用重写/尾随路径部分提供文件。 URL。 将用户提供的文件名保存在您自己的本地文件名中是困难的,并且即使不必担心Unicode也会导致安全灾难。

正如@bobince所提到的,PHP以System Locale的指定编码返回文件名, System Locale由非Unicode感知应用程序使用。 如果当前系统编码中不存在该字符,则文件名将包含“?” 相反,将无法访问。

您可以尝试在https://github.com/kenjiuno/php-wfio上安装php-wfio.dll ,并通过wfio://协议引用文件。

你错过了对$ file变量的另外两个引用,mate,但是这更好,因为我认为我可能已经发现了一种稍微更有效的方法; 尝试一下:

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
    while (false !== ($file = readdir($handle))) {
        $file = mb_substr($file, mb_strrpos($file, '/') + 1);
        if ($file != "." && $file != "..") {
            echo $file . "<br />\n";
        }
    }
    closedir($handle);
}
?>

mb_substr($ file,mb_strrpos($ file,'/')+ 1)替换$ file的任何实例,你应该好好去。 Huzzah用于多字节编码!

我认为Windows使用UTF-16作为文件名。 因此,请尝试使用mb_convert_encoding函数将内部编码转换为输出编码:

// convert from UTF-16 to UTF-8
echo mb_convert_encoding($file, 'UTF-8', 'UTF-16');

也许你必须先改变一些设置(参见mb_get_info )。

抱歉:)

尝试这个:

<?php if ($handle = opendir('C:/xampp/htdocs/movies')) { while (false !== ($file = readdir($handle))) { $filename_utf16 = iconv( "iso-8859-1", "utf-16", $file); if ($filename_utf16 != "." && $filename_utf16 != "..") { echo $filename_utf16 . "<br />\\n"; } } closedir($handle); } ?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM