如何在PHP中避免回显字符65279?

36
我遇到了一个类似的问题,描述在这里(以及其他地方) - 在ajax回调中,我得到了一个xmlhttp.responseText的响应文本,它看起来很正常(当我alert它时,它显示正确的文本),但是当使用“if”语句将其与字符串进行比较时,它返回false。
(我也是编写返回该字符串的服务器端代码的人) - 经过多次研究该字符串后,我发现该字符串的第一个字符是一个“不可见字符”。一个不显示的字符。如果我将它复制到记事本中,然后删除第一个字符-它不会被删除直到再次按下Delete键。
我对xmlhttp.responseText中返回的字符串进行了charCodeAt(0)。并且它返回65279
搜索发现它是某种UTF-8控制字符,应该设置“大端”或“小端”编码。
所以,现在我知道了问题的原因-但是......为什么那个字符正在被回显? 在源PHP中,我只是使用

echo 'the string'...

它似乎输出了[chr(65279)]这个字符,为什么?我该如何避免这种情况?


那要看数据的情况。没有看到你的代码,我们无法确定。你控制ajax获取的数据吗?它是如何被提供给ajax的? - Drazisil
它来自我编写的一个php文件。该php回显字符串“CHECKTABLE OK”。问题是 - 即使我只在浏览器上运行php,然后复制并粘贴回显的字符串 - 我检查并看到chr-65279位于字符串开头... - Yuval A.
顺便提一下,那个字符也被称为字节顺序标记(BOM)字符... - Yuval A.
你用什么编辑器来编辑PHP文件?使用一个允许更改编码的编辑器,比如EmEditor,并将你的PHP文件“以二进制方式”打开,看看是否在字符串或文件开头看到任何奇怪的字符。这应该可以告诉我们BOM是在源文件中还是后来添加的。 - nobody
我用十六进制编辑器打开了PHP文件。BOM不在那里。我很确定它是后来添加的... - Yuval A.
12个回答

80

总结并指定解决方案:

Windows记事本会在保存为UTF-8编码的文件中添加BOM字符(3个字节:EF BB BF)。

PHP似乎不会受到影响,除非你将一个php文件包含到另一个文件中,
这样会导致问题出现,字符串前面会显示带有字符(65279)。

你可以使用其他文本编辑器(如Notepad++)编辑该文件,并使用编码
"Encode in UTF-8 without BOM",
这似乎可以解决问题。

此外,你可以使用记事本将另一个php文件保存为ANSI编码 - 这也似乎可以解决问题(也就是说,如果你实际上没有在文件中使用任何扩展字符...)


4
非常感谢您在此处提供解决方案,它为我节省了几个小时的搜索时间!我很幸运您写下了字符编号,而且 Google 真的很喜欢 StackOverflow :-) - t.mikael.d
这对我很有帮助!我在@model语句前面有一个看不见的问号。谢谢! - Christopher Marshall
如果您在Android上使用Java中的BufferedReader进行阅读,然后重写文件,它会保存为,这也会出现,这非常讨厌,我知道现在可以安全地将其修剪掉,谢谢。 - Martin Belcher - AtWrk

7
如果您想打印包含“零宽不间断空格”字符的字符串(例如通过包含外部非PHP文件),请尝试以下代码:
echo preg_replace("/\xEF\xBB\xBF/", "", $string);

4
如果你使用的是Linux或Mac,这里有一个优雅的解决方案来消除PHP中的字符。
如果你使用WordPress(全球25%的网站都由WordPress驱动),那么很可能是插件或活动主题引入了BOM字符,因为其中一个文件包含BOM(也许该文件在Windows中编辑过)。如果是这种情况,请转到wp-content/themes/文件夹并运行以下命令:
grep -rl $'\xEF\xBB\xBF' .

这将搜索带有BOM的文件。如果列表中有.php结果,则执行以下操作:
  1. 将文件重命名为类似于filename.bom.bak.php的名称
  2. 在编辑器中打开文件并将内容复制到剪贴板中
  3. 创建一个新文件并粘贴剪贴板中的内容
  4. 使用原始名称filename.php保存文件
如果您正在处理本地文件,则最终需要重新上传新文件到服务器。
如果运行grep命令后没有结果,并且您正在使用WordPress,则检查/wp-content/plugins文件夹是否有BOM文件。进入该文件夹并再次运行该命令。或者,您可以开始停用所有插件,然后检查问题是否解决,同时再次激活插件。
如果您没有使用WordPress,则转到项目文件夹的根目录并运行命令以查找带有BOM的文件。如果找到任何文件,则运行上述四个步骤。

非常感谢 @julianm,它帮助我找到了文件。正如 @Renoir Dos Reis 在上一个答案中建议的那样,在文件顶部的 <?php 前面有一个空格。 - Awsme Sandy

3
您也可以使用以下javascript代码去除字符:
``` myString = myString.replace(String.fromCharCode(65279), "" ); ```
该代码将会移除指定的字符。

2
我曾��到过这个问题,�试将编�更改为utf-8 without bom�Ansi等,但都没有�功。我的问题是由�在html body中使用了php include函数所致。将include函数移到html(!DOCTYPE标签之上)之��以解决这个问题。
当我知�我的问题�,我测试了include�include_once和require函数。所有�试�html body中包�文件的�试都会在PHP代�开始的�置创建�外的�项�字符。
我还�试将include的结�分�给一个��...�$result = include("myfile.txt");,但�然添加了相�的�外字符。
请注�,将include移到HTML之��会删除显示的�外字符,但它会将其�我的数�和内容区域中移除。

1
我正在使用PhpStorm集成开发环境来开发php页面。
我遇到了这个问题,并使用IDE中的这个选项来删除任何BOM字符,问题得以解决:
文件 -> 删除BOM
尝试在您的IDE中查找类似的选项。

请尽量避免在您的帖子中添加问候和敬语。它们不属于这里,因为这不是一个论坛。我们期望技术写作。谢谢。 - halfer

1
除此之外,我在从MySQL数据库中提取一些数据时遇到了问题(字符集设置为UTF-8)- 问题是HTML标签,我允许显示基本标签,如<p>和<a>,但在页面上显示时,通过Chrome的Dev工具查看,我得到了&#65729个字符。
因此,我从表格中删除了标签,这样就解决了&#65729个问题(以及文本应显示的空白行上面的空白行)。
我只是想补充一下,因为我的声望还不够高,无法在答案上发表评论。
编辑:使用VIM,我能够通过:set nobomb去掉BOM,并且您可以通过:set bomb?确认BOM的存在,它将显示bombnobomb

1

我使用的是"梦想编织者CC 2015",默认情况下启用了此选项:"包括BOM签名"或类似选项,当您从文件菜单中选择"另存为"选项时。在出现的窗口中,您可以看到"Unicode选项"。您可以禁用BOM选项。并记得像那样更改所有文件。或者您可以简单地转到首选项中禁用BOM选项并保存所有文件。


0
我的解决方案是创建一个包含以下内容的php文件:
<?php
header("Content-Type:text/html;charset=utf-8");
?>

将其保存为ANSI格式,然后其他PHP文件在任何HTML或PHP代码之前都需要require/include它。


0

可能是服务器上的某些问题。如果您知道它存在,请在解决之前绕过它。

myString = myString.substring(1)

截取掉第一个字符。


这是我现在要做的事情,但我仍然想知道如何避免它。目前服务器是我的本地计算机... - Yuval A.
它必须与源代码有关。您是自己创建文本“CHECKTABLE OK”,还是只是回显函数的响应? - Drazisil
我是自己创建的。此外,如果我在php中只是做一个简单的echo并检查字符串-该字符也总是带有前缀。这应该与utf-8编码有关。 (顺便说一下,文件是使用Windows记事本保存为utf-8格式的...)就像要告诉php如何不要一直放那个字符一样......但我不知道该怎么做.... - Yuval A.
希望其他人能提供答案。我讨厌BOM。不过顺带一提,如果您使用记事本,我建议用[notepad2](http://www.flos-freeware.ch/notepad2.html)代替它。它具有语法高亮和允许更改编码的功能。非常有用。 - Drazisil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接