【问题标题】:PHP, remove BOM when requiring a PHP filePHP,需要 PHP 文件时删除 BOM
【发布时间】:2015-11-06 03:26:41
【问题描述】:

美好的一天!

我想我几乎阅读了所有与 PHP 和 BOM 相关的问题,但我仍然没有找到适合我的问题的答案。所以我在这里:

我有一个 PHP 脚本 (loader.php),它第一次运行时会生成一个配置文件 (_config.php) 在这个脚本中,我只存储了一些与第一次调用的环境有关的变量。 如果 _config.php 文件已经存在,我在 loader.php

中需要它

一切正常,但问题是 _config.php 需要创建为 UTF8。 它对我有用的唯一方法是question,是与

file_put_contents(
    $folder, 
    "\xEF\xBB\xBF".$phpCommands
);

当然,这会添加 BOM,我在第二次调用 loader.php 时使用 require 函数时读取了它,最终在开头产生众所周知的额外空间问题页。我尝试使用建议的方法 here 将其从页面的最终输出中删除,但它不会影响结果,可能是因为 BOM 是通过 require 而不是通过 fopen 或类似方法插入的。

我所有的 PHP 脚本都是 UTF-8(没有 BOM)。 生成的 _config.php 是 UTF-8 "with BOM"。

为了解决这个问题,我有两个解决方案,但我不知道如何使它们起作用:

  1. 创建一个没有 BOM 的 UTF8 编码文件(流,iconv 不是一个选项,因为旧 PHP)
  2. require_once 删除 BOM 的文件

谁能帮帮我?

请不要建议我生成/存储配置的替代策略。必须这样做。

非常感谢!

【问题讨论】:

  • "\xEF\xBB\xBF" 不会改变$phpCommands 的编码,只是告诉文件应该被视为UTF-8。所以$phpCommands 必须已经用 UTF-8 编码,如果你要删除 BOM,解决方案是一开始就不要添加它。
  • PHP 没有字符编码的概念,它将所有字符串都视为字节数组。如果您的 $phpCommands 字符串已经是 UTF-8 编码的文本,则不需要 BOM。如果不是,添加 BOM 不会神奇地做到这一点。
  • 感谢您的回复!好吧,如果我尝试: file_put_contents( $folder, utf8_encode($phpCommands) );生成的文件没有编码(至少我可以用 Notepad++ 看到)。虽然我看到添加 BOM 被识别为 UTF-8 @AD7six :我的意思是我必须生成配置文件。有人可能会争辩说我可以将它存储在数据库或其他东西中。

标签: php encoding utf-8


【解决方案1】:

创建文件时只需不要添加 BOM。它没有任何目的。

对于您的“它对我有用的唯一方法”最可能的解释只是一种糟糕的测试方法,不多也不少。意思是,您的文件是用 UTF-8 完美创建的,无论您使用什么方法来确认它是有缺陷的。我猜你在某个文本编辑器中打开了生成的文件,那个编辑器告诉你文件编码是“ANSI”或“ASCII”之类的。

好吧,纯文本文件不会在任何地方声明其编码。您的文本编辑器只是猜测其编码。如果文件内容只是纯英文/ASCII,那么 ASCII、ANSI 和 UTF-8 之间没有任何区别。您的文本编辑器只是告诉您一个可能的答案,其中任何答案都同样有效。添加 BOM 会在文件开头显式提示编码为 UTF-8,这是编辑器选择的。

这个或类似的东西,很可能是你的全部问题。

【讨论】:

  • 糟糕的测试方法...感谢您的帮助!
  • @Fabbio 提示:唯一对编码有意义的测试方法是断言给定文件在特定编码中有效。即,永远不要试图弄清楚一个文件的编码是什么,只测试它是否是你认为的编码。例如,在命令行上使用 iconv:iconv -f UTF-8 file.txt - 如果没有错误,您的文件是 UTF-8 编码的。
  • 好的,但请稍等:现在,如果我在 _config.php 文件中手动插入一个非 ASCII 字符(比如 à),它将无法在 loader.php 中正确呈现(问号)。你的意思是当我保护文件时是编辑器设置/更改编码?
  • 编辑器决定使用哪种编码来保护文件;换句话说,将哪些字节转储到文件中。如果您的编辑器决定将文件另存为 ISO-8859-1(“Latin-1”),那么您的文件将不会采用 UTF-8 编码。可能是以前,但不是在您的编辑决定将其另存为其他内容之后。那,或者你没有在你的应用程序中正确处理编码,这就是它搞砸的地方。
  • 好的,我添加 BOM 的原因是编辑器将文件中的文本识别为 UTF-8... 现在我尝试将“ààà”.$phpCommands 保存在_config.php 并正确显示在页面中。并且神奇的 Notepad++ 将文件识别为没有 BOM 的 UTF-8。所以我在这里的猜测是,只要有一个非 ASCII 字符,编辑器就会猜测 UTF-8。让它与 Notepad++ 一起工作的技巧可能是在文本文件中添加一个非 ASCII 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多