我目前正试图编写一个简单的脚本来查看一个文件夹,并返回一个RSS源中所有文件名的列表。 然而,我已经打了一道大墙…每当我尝试读取日文字符的文件名时,它显示为? 我已经尝试了这里提到的解决scheme: php readdir问题与日语文件名 – 但是他们不工作的原因,即使:
header('Content-Type: text/html; charset=UTF-8'); setlocale(LC_ALL, 'en_US.UTF8'); mb_internal_encoding("UTF-8");
在顶部(导出为纯文本,直到我可以解决这个问题)。
我能做什么? 我需要这个工作,我没有太多的时间。
你可以用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/读一个目录式窗口-36169.html
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); }
这不可能。 这是PHP本身的限制。 PHP不使用宽的WIN32 API调用,所以受限于代码页。 UTF-8(65001)不适用于此目的。
如果你在win32\readdir.c
readdir_r()
中设置了一个断点,你会发现FindNextFile
已经返回一个带有问号的文件名来替代你想要的字符,所以除了修补PHP之外,没有什么可以做的本身。
这将在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); }
是的,不,像其他人所说的那样,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。不是最好的,但工作和快速设置)