我遇到过here所描述的类似问题(以及其他地方) - 在ajax回调中,我得到一个似乎没问题的xmlhttp.responseText(当我提醒它时 - 它显示正确的文本) - 但是当使用'if'语句将它与字符串进行比较时 - 它返回false。
(我也是编写服务器端代码返回该字符串的人) - 在研究了字符串之后 - 我发现字符串有一个“隐形字符”作为它的第一个字符。未显示的角色。如果我将其复制到记事本 - 然后删除第一个字符 - 在再次按Delete之前不会删除。
我在xmlhttp.responseText中为返回的字符串做了一个charCodeAt(0)。它返回 65279 。
谷歌搜索它显示它是某种UTF-8控制字符,应该设置“big-endian”或“small-endian”编码。
所以,现在我知道问题的原因了 - 但是......为什么这个角色会被回应呢? 在源php我只是使用
echo 'the string'...
它显然以某种方式输出[chr(65279)]字符串......
为什么呢?我怎么能避免它?
答案 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结果,请执行以下操作:
如果您在本地处理此问题,那么最终您需要将新文件重新上传到服务器。
如果在运行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的存在,该bomb
或nobomb
会显示
答案 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中找到类似的选项。