Dar*_*tic 8 php string unicode
例如,我有一个这样的文件名 - проба.xml,我无法从PHP脚本打开它.
如果我将php脚本设置为utf-8,那么脚本中的所有文本都是utf-8,因此当我将其传递给file_get_contents时:
$fname = "?????.xml";
file_get_contents($fname);
Run Code Online (Sandbox Code Playgroud)
我得到文件不存在的错误.原因是在Windows(XP)中,所有带有非拉丁字符的文件名都是unicode(UTF-16).好的,所以我试过这个:
$fname = "?????.xml";
$res = mb_convert_encoding($fname,'UTF-8','UTF-16');
file_get_contents($res);
Run Code Online (Sandbox Code Playgroud)
但是错误仍然存在,因为file_get_contents无法接受unicode字符串...
有什么建议?
Hen*_*han 11
虽然文档似乎没有提及它,但PHP 7.0及更高版本最终支持Windows上的Unicode文件名.PHP的文件系统的API接受并根据返回的文件名default_charset,这是UTF-8默认.
请参阅此处的错误修复:https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f
如果您可以访问PHP扩展目录,可以尝试php-wfio.dll在https://github.com/kenjiuno/php-wfio上安装,并通过wfio://协议引用文件.
file_get_contents("wfio://??.xml");
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
如果直接将文件保存为Big-5,则如下所示:
$fname = "??.xml";
file_get_contents($fname);
Run Code Online (Sandbox Code Playgroud)
到目前为止,这些是结论:
因此结论在 PHP 5 中不可行。
| 归档时间: |
|
| 查看次数: |
10210 次 |
| 最近记录: |