API 端点响应中出现未知字符

问题描述 投票:0回答:1

我的遗留项目依赖于 Drupal 7 和 PHP 5.6,遇到了一个问题,即通过 API 端点将未知字符添加到某些数据中。特别令人困惑的是,这个字符只出现在一些受影响的数据中,我不确定是什么原因造成的。

未知字符的存在使我们无法正确解码 API 响应,尽管我已经找到了在解码之前删除该字符的解决方法,但我的任务是调查其来源。虽然我无法在本地环境中重现该问题,但在对生产服务器进行任何更改之前,我需要具体证据。

这是未知字符的十六进制 (

efbb bf
):

enter image description here

在整个项目中进行彻底搜索后,我只能在 UnicodeTest.txt 文件中找到该字符,如附图所示。

enter image description here

ZWNBSP 是我的 API 端点的开始响应中显示的未知字符。如果我复制并粘贴它就像空字符一样。我无法通过 Google 聊天或其他消息应用程序发送它。似乎我在浏览器上看不到该字符,但我可以在 PHPstorm 终端上看到该字符。您可以在本页查看“!”#$%&“字符之前的字符

我不知道它从哪里来。有人有线索吗?

我想到的可能性:

  1. 来自CDN/WAF的Bug,我们使用CloudFlare
  2. 生产服务器上的 PHP 错误
  3. 来自 drupal 7.39 的错误(不太确定,因为只在 UnicodeTest.txt 中找到该字符并且仅在单元测试中使用)
php unicode drupal-7 response
1个回答
0
投票

正如 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 库。祝你好运,追踪它!

© www.soinside.com 2019 - 2024. All rights reserved.