我目前正在尝试编写一个查看文件夹的简单脚本,并返回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");
在顶部(导出为纯文本,直到我可以对其进行排序)。
我该怎么办?我需要这个工作,我没有太多时间。
答案 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)
你可以在PHP中完成。编写一个小型C程序来读取目录并从PHP调用该程序。
另见: http://en.literateprograms.org/Directory_listing_(C,_Windows) http://www.daniweb.com/forums/thread74944.html http://forums.devshed.com/c-programming-42/reading-a-directory-in-windows-36169.html
答案 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。不是最好但工作正常且设置快速)