【问题标题】:php mkdir() in hebrew creates gibrish folder希伯来语中的 php mkdir() 创建乱码文件夹
【发布时间】:2012-07-28 18:46:03
【问题描述】:

我正在尝试使用英文的 php 制作一个目录,它正在工作。 但是当我在希伯来语中尝试时,它会像这样在 gibrish 中创建文件夹: ׳”׳•׳¨׳“׳”| ׳׳©׳—׳§ ׳©׳•׳׳~

我该如何解决? 谢谢

【问题讨论】:

  • 我知道,但我该如何解决?

标签: php html mkdir


【解决方案1】:

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 * 字符串。

【讨论】:

  • 感谢您的尝试,但 setlocale 不起作用。无论如何,它可能会在 gibrish 中创建文件夹,但是当我尝试访问 url 时,它可以在希伯来语中使用。所以我可以做到这一点。谢谢!
【解决方案2】:

使用 mb_convert_encoding 将名称(字符串)从 UTF-8 转换为 ISO-8859-8。 我已经使用 PHP 7 和 Windows 10 对其进行了测试。

【讨论】:

    【解决方案3】:

    基本上你不能,除非你的操作系统的编码系统支持这些字符。希伯来语也必须是扩展的 UTF-8 包的一部分吧?

    例如,在 Windows 下,默认代码页是 iso-8859-1,它没有希伯来语。

    我认为将它切换到 UTF-8 可能会起作用,因为现在新的 Windows 版本允许文件名中包含所有 Unicode 字符,但它并不真正推荐

    【讨论】:

    • 在哪里切换到UTF-8?我已经尝试过 header('Content-Type: text/html; charset=utf-8');
    猜你喜欢
    • 2012-03-10
    • 2011-09-01
    • 2015-06-17
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多