4

我有以下代码

<?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 研极超人あ~る</p>

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

谢谢你帮助我:)

4

6 回答 6

9

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

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

为了解决这个问题,PHP 必须像 Python 3.0 一样开始使用 Unicode 字符串作为文件名(以及其他所有内容),使用 '_wopen'-et-al 函数在 Windows 下获得对文件名的本地 Unicode 访问。我预计这将在 PHP6 中发生,但目前您可能已经吃饱了。您可以将系统代码页更改为 cp932 以访问文件名,但您仍然会得到“?” Shift-JIS 中没有的任何其他 Unicode 字符的字符,并且在任何情况下,您都不希望将应用程序的内部字符串全部设为 Shift-JIS,因为它是一种非常可怕的编码。

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

于 2009-03-01T09:36:12.797 回答
2

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

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

于 2015-01-29T17:45:52.373 回答
0

sorry :)

tries this:

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

于 2009-03-01T08:52:13.807 回答
0

您错过了对$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);
}
?>
于 2009-01-27T08:49:06.947 回答
-1

我认为 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)。

于 2009-01-28T13:42:22.550 回答
-1

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

于 2009-01-27T06:27:05.127 回答