我有以下代码
<?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研极极人あ〜る
无论如何要让它显示正确的名称或让其他人可以下载?
感谢您帮助我:)
答案 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);
}
?>