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

IT技术 php javascript ajax utf-8
2021-02-11 07:08:25

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

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

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

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

所以,现在我知道问题的原因了——但是……为什么那个角色会被回响?在源 php 中,我只是使用

echo 'the string'...

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

为什么?我怎样才能避免它?

6个回答

总结并指定解决方案:

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

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

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

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

这对我有帮助!我的@model 语句前面有一个不可见的问号。谢谢!
2021-03-15 07:08:25
非常感谢您在这里编写此解决方案,它为我节省了几个小时的搜索时间!我很幸运你写了字符号,而且谷歌只是喜欢 stackoverflow :-)
2021-03-23 07:08:25
如果您在 Android 上使用 Java 中的 BufferedReader 阅读,这也会显示出来,如果您然后重写文件,它会保存为  非常讨厌,我知道我现在可以安全地将其修剪掉,谢谢。
2021-03-31 07:08:25

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

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

如果您使用的是 Linux 或 Mac,这里有一个优雅的解决方案来摆脱 PHP 中的 字符。

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

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

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

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

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

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

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

非常感谢@julianm,它帮助我找到了文件,是的,正如@Renoir Dos Reis 在最后一个答案中所建议的那样,它是<?php文件顶部之前的一个空格
2021-03-26 07:08:25

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

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

我遇到了这个问题,并将我的编码更改为 utf-8,没有 bom、Ansi 等,但没有运气。我的问题是由在 html 正文中使用 php 包含函数引起的。将包含函数移动到我的 html 上方(在 !DOCTYPE 标签上方)解决了这个问题。

在我知道我的问题后,我测试了 include、include_once 和 require 函数。所有从 html 正文中包含文件的尝试都会在 PHP 代码开始的地方创建额外的杂项 𐃁 字符。

我还尝试将包含的结果分配给一个变量......即 $result = include("myfile.txt"); 添加相同的额外字符

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