php readdir问题与日语文件名

时间:2009-01-27 04:50:53

标签: php readdir

我有以下代码

<?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研极极人あ〜る

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

感谢您帮助我:)

6 个答案:

答案 0 :(得分:9)

我不能肯定地说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函数来获取文件名的本机Unicode访问权限在Windows下。我希望这会发生在PHP6中,但目前你可能已经填满了。您可以将系统代码页更改为cp932以访问文件名,但是对于不在Shift-JIS中的任何其他Unicode字符,您仍然会得到'?'字符,并且无论如何您真的想要使你的应用程序的内部字符串全部为Shift-JIS,因为它的编码非常糟糕。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

<?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);
}
?>

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

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

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

可能您必须先更改某些设置(请参阅mb_get_info)。

答案 5 :(得分:-1)

抱歉:)

尝试这个:

<?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); } ?>

相关问题