例如我有一个像这样的文件名 - проба.xml,我无法从PHP脚本中打开它。
如果我将php脚本设置为utf-8,那么脚本中的所有文本都是utf-8,因此当我将其传递给file_get_contents时:
$fname = "проба.xml";
file_get_contents($fname);
我收到文件不存在的错误。原因是在Windows(XP)中,所有带有非拉丁字符的文件名都是unicode(UTF-16)。好的,所以我尝试了这个:
$fname = "проба.xml";
$res = mb_convert_encoding($fname,'UTF-8','UTF-16');
file_get_contents($res);
但错误仍然存在,因为file_get_contents无法接受unicode字符串......
有什么建议吗?
答案 0 :(得分:11)
虽然文档似乎没有提及它,但PHP 7.0及更高版本最终支持Windows上的Unicode文件名。 PHP的文件系统API根据default_charset
接受并返回文件名,默认情况下为UTF-8
。
请参阅此处的错误修正:https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f
如果您有权访问PHP扩展目录,可以尝试在https://github.com/kenjiuno/php-wfio安装php-wfio.dll
,并通过wfio://
协议引用文件。
file_get_contents("wfio://你好.xml");
Windows上的PHP使用Legacy" ANSI API"专门用于本地文件访问,这意味着PHP使用系统区域设置而不是Unicode。
要访问文件名包含Unicode的文件,必须将文件名转换为当前系统区域设置的指定编码。 如果文件名包含在指定编码中无法表示的字符,那么您将失去运气 (更新:请参阅上面的解决方案部分)。 scandir
将为这些文件返回乱码并将字符串传回fopen
,等效项将失败。
要找到要使用的正确编码,您可以通过调用<?=setlocale(LC_TYPE,0)?>
并查找代码页标识符(.
之后的数字)来获取系统区域设置在MSDN文章https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx。
例如,如果函数返回Chinese (Traditional)_HKG.950
,则表示950代码页正在使用,文件名应转换为big-5编码。在这种情况下,如果您的文件以UTF-8保存(最好没有BOM),您的代码必须如下所示:
$fname = iconv('UTF-8','big-5',"你好.xml");
file_get_contents($fname);
或如果直接将文件另存为Big-5:
$fname = "你好.xml";
file_get_contents($fname);
答案 1 :(得分:0)
你可以尝试:
希望这有帮助!
答案 2 :(得分:0)
目前为止的结论是:
因此,这个结论在PHP 5中无法实现。