【发布时间】:2012-07-28 18:46:03
【问题描述】:
我正在尝试使用英文的 php 制作一个目录,它正在工作。 但是当我在希伯来语中尝试时,它会像这样在 gibrish 中创建文件夹: ׳”׳•׳¨׳“׳”| ׳׳©׳—׳§ ׳©׳•׳׳~
我该如何解决? 谢谢
【问题讨论】:
-
我知道,但我该如何解决?
我正在尝试使用英文的 php 制作一个目录,它正在工作。 但是当我在希伯来语中尝试时,它会像这样在 gibrish 中创建文件夹: ׳”׳•׳¨׳“׳”| ׳׳©׳—׳§ ׳©׳•׳׳~
我该如何解决? 谢谢
【问题讨论】:
PHP 在处理字符串时有一些 Unicode 支持,但内部 PHP 的字符串类型是单字节的,不支持多字节编码。如果您将 PHP 文件保存为 UTF-8 格式,则可以使用正确的 HTTP 编码以 UTF-8 输出字符串,但许多 PHP 函数不支持多字节字符串。有一些可以,但大多数没有。
我查看了 PHP 源代码,大多数文件系统函数(如 mkdir)都不支持 Unicode。它们对单字节字符串进行操作,这就是为什么当您尝试创建目录时会出现 ASCII 乱码。
您可以尝试在调用mkdir 之前调用setlocale 并将其设置为he_IL,看看这是否有任何不同。
更多信息:
字符串是一系列字符,其中一个字符与一个字符相同 字节。这意味着 PHP 只支持 256 个字符集,因此 不提供本机 Unicode 支持。见details of the string type。
详细信息更多地讨论了不同的编码、多字节感知的函数和基于 PHP 中是否启用 Zend 多字节支持的不同行为,以及以不同编码保存文件如何影响 PHP 中的字符串。
不幸的是,我不相信你能直接在 PHP 中创建一个包含多字节字符串的目录。
在内部,函数mkdir调用这个函数mkdir in file.c调用_php_stream_mkdir使用plain files wrapper调用php_mkdir_ex最终使用virtual_mkdir创建目录,使用C mkdir函数创建目录目录。
我认为当它调用 mkdir 在文件系统上创建目录时,所有编码都已丢失,它被视为单字节 char * 字符串。
【讨论】:
使用 mb_convert_encoding 将名称(字符串)从 UTF-8 转换为 ISO-8859-8。 我已经使用 PHP 7 和 Windows 10 对其进行了测试。
【讨论】:
基本上你不能,除非你的操作系统的编码系统支持这些字符。希伯来语也必须是扩展的 UTF-8 包的一部分吧?
例如,在 Windows 下,默认代码页是 iso-8859-1,它没有希伯来语。
我认为将它切换到 UTF-8 可能会起作用,因为现在新的 Windows 版本允许文件名中包含所有 Unicode 字符,但它并不真正推荐
【讨论】: