【问题标题】:How to avoid echoing character 65279 in php?如何避免在php中回显字符65279?
【发布时间】:2011-09-26 03:54:03
【问题描述】:

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

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

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

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

所以,现在我知道了问题的原因——但是……为什么要回显该字符? 在源 php 中,我只是使用

echo 'the string'...

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

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

【问题讨论】:

  • 这取决于数据。没有看到你的代码,我们不能说。您是否控制 ajax 正在提取的数据?它是如何提供给 ajax 的?
  • 它来自我写的一个php文件。 php 回显字符串“CHECKTABLE OK”。问题是 - 即使我只是在浏览器上运行 php - 然后复制粘贴回显的字符串 - 然后我检查并看到 chr-65279 位于字符串的开头......
  • 顺便说一句,该字符也称为字节顺序标记 (BOM) 字符...
  • 您使用什么编辑器来编辑您的 PHP 文件?使用允许更改编码的编辑器,例如EmEditor,并以“二进制”形式打开您的 PHP 文件,看看您是否在字符串的开头或文件的开头看到任何奇怪的字符。这应该告诉我们 BOM 是在源文件中还是稍后添加。
  • 我用十六进制编辑器打开了 php。 BOM 不存在。我很确定它是稍后添加的...

标签: php javascript ajax utf-8


【解决方案1】:

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

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

File -> Remove BOM

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

【讨论】:

  • 请尽量避免在您的帖子中添加问候和称呼。他们不属于这里,因为这不是论坛。预计技术写作。谢谢。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      当使用 atom 时,它是文档开头 &lt;?php 之前的空格

      【讨论】:

      • 感谢您的技巧,我借助代码 grep -rl $'\xEF\xBB\xBF' . 找到了文件,并且我在 &lt;?php 之前找到了相同的空白,并且成功了
      【解决方案5】:

      我使用“Dreamweaver CC 2015”,默认情况下启用此选项:“包含 BOM 签名”或类似的东西,当您从文件菜单中单击另存为选项时。在出现的窗口中,您可以看到“Unicode 选项..”。您可以禁用 BOM 选项。并记住像这样更改所有文件。或者您可以简单地转到首选项并禁用 BOM 选项并保存所有文件。

      【讨论】:

        【解决方案6】:

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

        如果您使用 WordPress(25% 的 Internet 网站由 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,那么检查 BOM 文件的另一个地方是 /wp-content/plugins 文件夹。去那里并再次运行命令。或者,您可以开始停用所有插件,然后在再次激活插件时检查问题是否已解决。

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

        【讨论】:

        • 非常感谢@julianm,它帮助我找到了文件,是的,正如@Renoir Dos Reis 在最后一个答案中建议的那样,它是文件顶部&lt;?php 之前的一个空格。
        【解决方案7】:

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

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

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

        请注意,将包含移动到 HTML 上方不会从显示中删除多余的字符,但是它会从我的数据和内容区域中删除它。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            除了上述之外,我在从 MySQL 数据库中提取一些数据时遇到了这个问题(字符集设置为 UTF-8) - 问题是 HTML 标签,我允许使用一些基本标签,如

            和 当我在页面上显示它时,我通过 Chrome 中的开发工具查看了 𐃁 字符。

            所以我从表格中删除了标签,并删除了 𐃁 问题(以及要显示文本的位置上方的空白行。

            我只是想补充一下,因为我的 Rep 不够高,无法真正评论答案。

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

            【讨论】:

              【解决方案10】:

              您还可以使用以下方法删除 javascript 中的字符:

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

              【讨论】:

                【解决方案11】:

                总结并指定解决方案:

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

                PHP 似乎并没有被它困扰——除非你将一个 php 文件包含到另一个文件中—— 然后事情变得一团糟,字符串会显示为前面的字符(65279)。

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

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

                【讨论】:

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

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

                myString = myString.substring(1)

                删除第一个字符。

                【讨论】:

                • 这就是我现在要做的,但我仍然想知道如何避免它。现在的服务器是我电脑上的本地主机...
                • 它必须与来源有关。您是自己创建文本“CHECKTABLE OK”,还是只是响应函数的响应?
                • 我自己创建的。此外,如果我只是在 php 中做一个简单的回显并检查字符串 - 该字符也总是以字符串为前缀。它应该与 utf-8 编码有关。 (顺便说一句,这些文件使用 Windows 记事本保存为 utf-8 ......)就像,以某种方式告诉 php 不要一直放置该字符......我不知道如何......
                • 希望其他人能给出答案。我讨厌 BOM。在不相关的注释中,如果您使用记事本,我将我的替换为 notepad2。它具有语法突出显示并允许您更改编码。很有帮助。
                猜你喜欢
                • 2016-11-26
                • 1970-01-01
                • 2023-03-28
                • 2020-12-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-10-17
                • 1970-01-01
                相关资源
                最近更新 更多