在PHP5.3和WindowsVista中使用日文文件名?

在PHP5.3和WindowsVista中使用日文文件名?,php,windows,unicode,utf-8,Php,Windows,Unicode,Utf 8,我目前正在尝试编写一个简单的脚本,在文件夹中查找,并返回RSS提要中所有文件名的列表。但是我撞到了一堵大墙。。。每当我尝试读取包含日语字符的文件名时,它都会将它们显示为?s。我尝试过这里提到的解决方案:-但是由于某些原因,它们不起作用,即使: header('Content-Type: text/html; charset=UTF-8'); setlocale(LC_ALL, 'en_US.UTF8'); mb_internal_encoding("UTF-8"); 在顶部(以纯文本形式导出,

我目前正在尝试编写一个简单的脚本,在文件夹中查找,并返回RSS提要中所有文件名的列表。但是我撞到了一堵大墙。。。每当我尝试读取包含日语字符的文件名时,它都会将它们显示为?s。我尝试过这里提到的解决方案:-但是由于某些原因,它们不起作用,即使:

header('Content-Type: text/html; charset=UTF-8');
setlocale(LC_ALL, 'en_US.UTF8');
mb_internal_encoding("UTF-8");
在顶部(以纯文本形式导出,直到我可以解决此问题)


我能做什么?我需要这个来工作,我没有太多时间。

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


如果您在
win32\readdir.c
中的
readdir\u r()
设置断点,您将看到
FindNextFile
已经返回了一个带有问号的文件名来代替您想要的字符,因此除了修补PHP本身之外,您对此无能为力。

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


如果在
win32\readdir.c
中的
readdir\u r()
处设置断点,您将看到
FindNextFile
已经返回一个带有问号的文件名来代替所需的字符,因此除了修补PHP本身之外,您对此无能为力。

您可以在PHP中执行此操作。编写一个小C程序来读取目录,并从PHP调用该程序

另见:

您可以在PHP中完成。编写一个小C程序来读取目录,并从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);
}
if($handle=opendir($this->dir)){
while(false!=($file=readdir($handle))){
$name=mb_convert_编码($file,“UTF-8”,“SJIS-win”);
回显“$name
”; } closedir($handle); }
这将在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);
}
if($handle=opendir($this->dir)){
while(false!=($file=readdir($handle))){
$name=mb_convert_编码($file,“UTF-8”,“SJIS-win”);
回显“$name
”; } closedir($handle); }
是的,不,正如其他人所说,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。这不是最好的,但工作起来很快)

是的,不,正如其他人所说的,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。这不是最好的,但工作正常,安装速度很快)

您是否尝试查看您获得的页面属性?对于Firefox(右键单击-页面信息),你需要有编码:UTF-8,否则你的标题会出错。我认为没有解决办法。PHP在内部不使用unicode版本的windows API,并且多字节版本不接受UTF-8作为代码页。是否尝试查看您获得的页面属性?对于Firefox(右键单击-页面信息),你需要有编码:UTF-8,否则你的标题会出错。我认为没有解决办法。PHP在内部不使用windows API的unicode版本,多字节版本也不接受UTF-8作为代码页。。。既然PHP不是一个选项,那个么处理窗口文件名编码的替代语言是什么呢?我只需要导出文件夹中文件名的RSS提要(以及确切路径和其他一些简单文本)。罗马()是一个非常好的RSS库。好吧,那太糟糕了。。。既然PHP不是一个选项,那个么处理窗口文件名编码的替代语言是什么呢?我只需要导出文件夹中文件名的RSS提要(以及确切路径和其他一些简单文本)。ROME()是一个非常好的RSS库。您将其称为在PHP中实现吗p不过,这是一个可以接受的解决方法。您将其称为在PHP中执行吗?:p不过,这是一个可以接受的解决办法。