2012-07-28 52 views
2

我想在英语中使用php做一个dir,它的工作。 但是,当我尝试在希伯来语,它创建像gibrish这样的文件夹: '''''''“'”| ''''''''''''''〜php mkdir()在希伯来语创建gibrish文件夹

我该如何解决它? 谢谢

+2

这是一个编码问题 – 2012-07-28 18:48:22

+0

我知道,但我该如何解决它? – EtayRock 2012-07-28 18:49:56

+0

你在使用什么操作系统? – 2012-07-28 19:32:59

回答

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

细节更多地谈论不同的编码,功能是基于是否Zend的多字节支持多字节感知和不同的行为在PHP被启用,以及如何节省在PHP中不同的编码效果的字符串文件。

不幸的是,在这个时候,我不相信你能够直接在PHP中创建一个包含多字节字符串的目录。

在内部,功能mkdir调用此函数mkdir in file.c它调用_php_stream_mkdir它使用plain files wrapper调用php_mkdir_ex,最终创造出使用virtual_mkdir是使用C的mkdir函数创建目录的目录。

我认为在它调用mkdir在文件系统上创建目录的时候,所有的编码都已经丢失,并被视为单字节char *字符串。

+0

感谢您的尝试,但setlocale无法正常工作。 任何方式,它可能会创建在gibrish中的文件夹,但是当我试图去的网址,它在希伯来语中的作品。所以我可以管理。谢谢! – EtayRock 2012-07-29 12:54:14

0

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

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

我认为它转换为UTF-8可能工作为现在新的Windows版本允许在文件名中的所有Unicode字符,但它不是真的建议

+0

切换到UTF-8在哪里? 我已经试过 header('Content-Type:text/html; charset = utf-8'); – EtayRock 2012-07-28 19:15:10

1

使用mb_convert_encoding将名称(字符串)从UTF-8转换为ISO-8859-8。 我用PHP 7和Windows 10测试过它。