我的遗留项目依赖于 Drupal 7 和 PHP 5.6,遇到了一个问题,即通过 API 端点将未知字符添加到某些数据中。特别令人困惑的是,这个字符只出现在一些受影响的数据中,我不确定是什么原因造成的。
未知字符的存在使我们无法正确解码 API 响应,尽管我已经找到了在解码之前删除该字符的解决方法,但我的任务是调查其来源。虽然我无法在本地环境中重现该问题,但在对生产服务器进行任何更改之前,我需要具体证据。
这是未知字符的十六进制 (
efbb bf
):
在整个项目中进行彻底搜索后,我只能在 UnicodeTest.txt 文件中找到该字符,如附图所示。
ZWNBSP 是我的 API 端点的开始响应中显示的未知字符。如果我复制并粘贴它就像空字符一样。我无法通过 Google 聊天或其他消息应用程序发送它。似乎我在浏览器上看不到该字符,但我可以在 PHPstorm 终端上看到该字符。您可以在本页查看“!”#$%&“字符之前的字符
我不知道它从哪里来。有人有线索吗?
我想到的可能性:
正如 cbroe 所暗示的那样,字节序列
EF BB BF
是字符 U+FEFF
的 UTF-8 编码。该字符广泛用作文本文件开头的字节顺序标记。
但是,BOM 字符在
application/json
数据中无效(从您的屏幕截图中可以看出,您的 API 响应似乎是有效的)。返回带有 BOM 的 JSON 数据的 API 根本不符合 JSON 规范。如果 API 的资源类型是 text/plain
,则 BOM 是可以接受的。
过去,当我将一款坚持将 BOM 放在 XML 资源开头的软件(这是可接受的做法)与另一款拒绝任何 BOM 的软件集成时,我也遇到过类似的问题,并且在在我的案例中,我通过一种解决方法解决了该问题,即在创建 BOM 后将其剥离,随后我又修补了第二个软件,以便它接受 BOM。
很难知道
FEFF
字符来自哪里,尽管我认为它不太可能是您的 CDN;我的猜测是 Drupal 或一些负责序列化 JSON 的 PHP 库。祝你好运,追踪它!