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

时间:2011-06-30 16:45:42

标签: php javascript ajax utf-8

我遇到过here所描述的类似问题(以及其他地方) - 在ajax回调中,我得到一个似乎没问题的xmlhttp.responseText(当我提醒它时 - 它显示正确的文本) - 但是当使用'if'语句将它与字符串进行比较时 - 它返回false。

(我也是编写服务器端代码返回该字符串的人) - 在研究了字符串之后 - 我发现字符串有一个“隐形字符”作为它的第一个字符。未显示的角色。如果我将其复制到记事本 - 然后删除第一个字符 - 在再次按Delete之前不会删除。

我在xmlhttp.responseText中为返回的字符串做了一个charCodeAt(0)。它返回 65279

谷歌搜索它显示它是某种UTF-8控制字符,应该设置“big-endian”或“small-endian”编码。

所以,现在我知道问题的原因了 - 但是......为什么这个角色会被回应呢? 在源php我只是使用

echo 'the string'...

它显然以某种方式输出[chr(65279)]字符串......

为什么呢?我怎么能避免它?

12 个答案:

答案 0 :(得分:77)

总结并指定解决方案:

Windows Notepad将BOM字符(3个字节:EF BB BF)添加到使用utf-8编码保存的文件中。

PHP似乎并没有被它打扰 - 除非你将一个php文件包含在另一个中 - 然后事情变得混乱,字符串会显示在字符(65279)前面。

您可以使用其他文本编辑器(如Notepad ++)编辑文件,并使用编码
“在没有BOM的情况下编码UTF-8”,
这似乎解决了这个问题。

此外,您可以在记事本中保存其他带有ANSI编码的php文件 - 这似乎也有效(也就是说,如果您实际上不使用文件中的任何扩展字符,我猜...)< / p>

答案 1 :(得分:4)

如果要打印包含 ZERO WIDTH NO-BREAK SPACE 字符的字符串(例如,通过包含外部非PHP文件),请尝试以下代码:

echo preg_replace("/\xEF\xBB\xBF/", "", $string);

答案 2 :(得分:4)

如果您使用的是Linux或Mac,这是一个优雅的解决方案,可以摆脱PHP中的角色。

如果您使用WordPress(25%的互联网网站由WordPress提供支持),由于包含BOM的文件(可能该文件是在Windows中编辑的),插件或活动主题可能会引入BOM字符。 。如果是这种情况,请转到您的wp-content / themes /文件夹并运行以下命令:

grep -rl $'\xEF\xBB\xBF' .

这将搜索带有BOM的文件。如果列表中有.php结果,请执行以下操作:

  1. 将文件重命名为filename.bom.bak.php
  2. 在编辑器中打开文件并复制剪贴板中的内容。
  3. 创建一个新文件并粘贴剪贴板中的内容。
  4. 使用原始名称filename.php
  5. 保存文件

    如果您在本地处理此问题,那么最终您需要将新文件重新上传到服务器。

    如果在运行grep命令后没有结果并且您正在使用WordPress,那么检查BOM文件的另一个地方是/ wp-content / plugins文件夹。去那里再次运行命令。或者,您可以开始停用所有插件,然后在再次激活插件时检查问题是否已解决。

    如果您没有使用WordPress,请转到项目文件夹的根目录并运行命令以查找包含BOM的文件。如果找到任何文件,则运行上述四个步骤。

答案 3 :(得分:3)

您还可以使用以下命令删除javascript中的字符:

myString = myString.replace(String.fromCharCode(65279), "" );

答案 4 :(得分:2)

我遇到了这个问题并将我的编码更改为utf-8而没有bom,Ansi等没有运气。我的问题是由在html体中使用php include函数引起的。将include函数移到我的html(上面的!DOCTYPE标记)之上解决了这个问题。

在我知道我的问题后,我测试了include,include_once和require函数。所有尝试在html体内包含一个文件都会在PHP代码开始的位置创建额外的杂项?字符。

我还尝试将include的结果赋给变量...即$ result = include(“myfile.txt”);添加相同的额外字符

请注意,移动HTML上方的包含不会删除显示的额外字符,但会将其从我的数据中移除并移出内容区域。

答案 5 :(得分:1)

除了上述内容之外,我在从MySQL数据库(charset设置为UTF-8)中提取一些数据时遇到了这个问题 - 问题是HTML标记,我允许一些基本的数据,如&lt; p&gt;和&lt; a&gt;当我在页面上显示它时,我通过Chrome中的Dev Tools查看了&#65729字符。

所以我从表中删除了标签,删除了&amp;#65729问题(以及显示文本的位置上方的空白行。

我只想补充一点,因为我的Rep不够高,无法对答案进行实际评论。

编辑:使用VIM我可以使用:set nobomb删除BOM,您可以使用:set bomb?确认BOM的存在,该bombnobomb会显示

答案 6 :(得分:1)

我使用“Dreamweaver CC 2015”,默认情况下启用此选项:“包括BOM签名”或类似内容,当您单击文件菜单中的另存为选项时。在apears的窗口中,您可以看到“Unicode Options ..”。您可以禁用BOM选项。并记得改变你的所有文件。或者您只需转到首选项并禁用BOM选项并保存所有文件。

答案 7 :(得分:0)

可能是服务器上的东西。如果你知道它在那里,我会绕过它直到解决。

myString = myString.substring(1)

切掉第一个角色。

答案 8 :(得分:0)

使用atom时,在<?php

之前的文档开头是一个空白区域

答案 9 :(得分:0)

从文件中查找和删除此字符的Linux解决方案是使用sed -i 's/\xEF\xBB\xBF//g' your-filename-here

答案 10 :(得分:0)

我的解决方案是创建一个包含以下内容的php文件:

<?php
header("Content-Type:text/html;charset=utf-8");
?>

将其另存为ANSI,然后其他php文件将在所有html或php代码之前要求/包含此

答案 11 :(得分:0)

我正在使用PhpStorm IDE开发php页面。

我遇到了这个问题,并使用此IDE选项删除了任何BOM字符并解决了问题:

File -> Remove BOM

尝试在IDE中找到类似的选项。