在PHP 5.3和Windows Vista中使用日语文件名?

时间:2010-05-22 11:38:08

标签: php windows unicode utf-8

我目前正在尝试编写一个查看文件夹的简单脚本,并返回RSS源中所有文件名的列表。然而,我遇到了一个重要的问题......每当我尝试读取带有日文字符的文件名时,它就会显示为?我已经尝试过这里提到的解决方案:php readdir problem with japanese language file name - 但是由于某些原因它们不起作用,即使是:

header('Content-Type: text/html; charset=UTF-8');
setlocale(LC_ALL, 'en_US.UTF8');
mb_internal_encoding("UTF-8");

在顶部(导出为纯文本,直到我可以对其进行排序)。

我该怎么办?我需要这个工作,我没有太多时间。

5 个答案:

答案 0 :(得分:2)

function fx_dir_utf8 ($path)
{
    // use this as failback on windows for usual dir listing
    // give it a UTF-8 path and receive a UTF-8 listing
    $path       = iconv ('UTF-8', 'UTF-16LE', $path);
    $cmd        = 'cmd /U /C dir '. str_replace ('/', '\\', $path);
    // windows command line returns CP850 or UTF-16LE
    $dir_str    = shell_exec ($cmd);
    $dir_str    = iconv ('UTF-16LE', 'UTF-8', $dir_str);
print_r ($dir_str);

    // further parse $dir_str
    return ($dir_str);
}

答案 1 :(得分:1)

这是不可能的。这是PHP本身的限制。 PHP不使用广泛的WIN32 API调用,因此您受到代码页的限制。 UTF-8(65001)无效用于此目的。

如果您在readdir_r()的{​​{1}}设置断点,您会看到win32\readdir.c已经返回带有问号的文件名代替您想要的字符,所以没有什么是你可以做到这一点,除了修补PHP本身。

答案 2 :(得分:1)

答案 3 :(得分:1)

这会在Windows服务器上正确显示日文文件名

if ($handle = opendir($this->dir)) {
    while (false !== ($file = readdir($handle))){
        $name = mb_convert_encoding($file, "UTF-8", "SJIS-win" );
        echo "$name<br>";
    }
    closedir($handle);
}

答案 4 :(得分:1)

是的,不,正如其他人所说的那样,PHP 不能这样做...... 羞辱PHP!

正如其他人也建议的那样,一种替代方法可能是用另一种可以读取这些文件名的语言编写代理:

有人建议用C,但我个人发现 Python 更简单/更有吸引力(这里是Python3)。

** 在使用之前确保对您的变量进行消毒 **

$success = (bool)(int)shell_exec('python -c "import os;'.
    'os.chdir(\''.$dir.'\'); '.
    'import urllib.parse; '.
    'file_list = tuple(map(urllib.parse.quote_plus, os.listdir())); '.
    'print(int(\''.urlencode($_GET['src']).'\' in file_list and \''.urlencode($_GET['src'].'.part').'\' not in file_list))"'
);

是的,不是很漂亮,但是这个片段允许我通过urlencode来检查文件名。

Ndla:该特定代码段用于查找文件是否已完成使用Firefox下载而无需使用API​​。不是最好但工作正常且设置快速)