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

2022-08-30 13:02:42

我在这里(和其他地方)遇到了类似的问题 - 就像在ajax回调上一样,我得到一个xmlhttp.responseText,它似乎没问题(当我提醒它时 - 它显示了正确的文本) - 但是当使用'if'语句将其与字符串进行比较时 - 它返回false。

(我也是编写返回该字符串的服务器端代码的人) - 在对字符串进行了大量研究之后 - 我发现该字符串的第一个字符具有“不可见字符”。未显示的角色。如果我将其复制到记事本 - 然后删除了第一个字符 - 它不会删除,直到再次按“删除”。

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

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

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

echo 'the string'...

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

为什么?我该如何避免它?


答案 1

总结并指定解决方案:

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

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

您可以使用其他文本编辑器(如Notepad ++)编辑文件,并使用编码
“以UTF-8编码而不使用BOM”,
这似乎可以解决问题。

另外,您可以在记事本中保存另一个带有ANSI编码的php文件 - 这似乎也可以工作(也就是说,如果您实际上没有在文件中使用任何扩展字符,我猜...)


答案 2

如果要打印包含零宽度不间断空格字符的字符串(例如,通过包含外部非 PHP 文件),请尝试以下代码:

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