ilo*_*aly 5 php unicode encoding utf-8 filepath
我在运行linux的服务器上有一个包含Unicode字符的文件。如果我通过SSH进入服务器并使用制表符补全功能导航到包含Unicode字符的文件/文件夹,则可以轻松访问该文件/文件夹。当我尝试通过PHP访问文件时出现了问题(我从was访问文件系统的功能stat)。如果我将PHP脚本生成的路径输出到浏览器并将其粘贴到终端,则该文件似乎也存在(即使在终端中,文件路径也完全相同)。
我通过php_ini以及set将PHP设置为使用UTF8作为其默认编码mb_internal_encoding。我检查了PHP文件路径字符串编码,并按需要将其显示为UTF8。进一步研究一下,我决定hexdump使用é字符来表示终端的制表符补全,并将其与hexdump由PHP脚本或通过键盘手动输入的é字符(通过键盘上的option + e + e来创建)进行比较。 os x)。结果如下:
echo -né| 十六进制转储 0000000 cc65 0081 0000003 echo -né| 十六进制转储 0000000 a9c3 0000002
在终端中允许正确引用文件的é字符是3个字节。我不确定从这里开始,我应该在PHP中使用哪种编码?我应该通过iconv或将路径转换为另一种编码mb_convert_encoding吗?
多亏了这两个答案中给出的提示,我才能够四处寻找并找到一些方法来规范给定字符的不同unicode分解。在这种情况下,我遇到的是访问由OS X Carbon应用程序创建的文件。它是一个相当流行的应用程序,因此其文件名似乎遵循特定的unicode分解。
在PHP 5.3 中引入了一组新的函数,使您可以将unicode字符串标准化为特定的分解。显然,您可以将Unicode字符串分解为四个分解标准。自2.3版以来,Python通过unicode.normalize具有unicode规范化功能。这篇有关python处理unicode字符串的文章有助于更好地理解编码/字符串处理。
这是有关规范unicode文件路径的快速示例:
filePath = unicodedata.normalize('NFD', filePath)
Run Code Online (Sandbox Code Playgroud)
我发现NFD格式可以满足我的所有目的,我想知道这是否是Unicode文件名的标准分解。