【问题标题】:PHP: file() each character is preceded by "\0"PHP:file() 每个字符前面都有“\0”
【发布时间】:2011-10-03 00:50:36
【问题描述】:

我有一个 INI 文件,它是由我正在工作的团队的另一名成员编写的 AutoHotKey 程序创建的。我正在尝试将文件作为数组读入 PHP。我正在使用内置的file() 函数。当我读入文件然后使用var_dump($file)$file 是正在读入文件的数组的名称)显示它时,每个字符前面都有一个“\0”(这是一个空字符)。以前有人见过这种情况吗?我可以在读取文件后删除所有空字符,但我更愿意找到解决方案。

当我在文本编辑器中打开 ini 文件时,它打开得很好。我还使用 file() 函数读取了由 Windows 创建的 desktop.ini 文件,它按预期读取,字符前面没有“\0”

【问题讨论】:

标签: php file ini autohotkey


【解决方案1】:

这与文件的编码有关。一些(大多数)unicode 编码每个字符需要 2 个字节。这意味着每个单字节字符都以 \0 为前缀。该文件仍然完全有效,但如果您尝试使用 windows-1252 类型的单字节编码读取它,它看起来会很奇怪。您可以尝试通过utf8_decode 喂它,看看是否可以清除它。 UTF 8 是一种潜在的多字节编码,从 1 到 4 个字节(最少为 1)。 您的文本编辑器会自动识别并以 unicode 格式打开它,这就是它在那里看起来不错的原因。

注意:因为使用的是2字节编码,所以具体不是utf-8,可能是utf-16,但是UTF-8的函数或许能解析出来。

【讨论】:

  • utf8_decode 函数无法解析它。看来编码是 16 位 Unicode 格式。你知道可以解析这个的 PHP 函数吗?
  • $fixed = mb_convert_encoding($broken, 'UTF-8', 'UTF-16'); 可能会这样做,如果它真的是 UTF-16。
  • 是的,我忘记了 mb 字符串函数:php.net/manual/en/book.mbstring.php
【解决方案2】:

您是否在 HEX 编辑器中打开了文件?您的文件中可能有隐藏字符...

【讨论】:

  • 是的,我有,而且似乎所有其他字符都是空字符。我无法更改生成 ini 文件的程序对文本的编码方式,但它似乎使用 16 位 Unicode 格式。有没有办法在 PHP 中进行转换,以便正确显示文件?
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 2020-10-29
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多