gpt4 book ai didi

php - cURL 获取带有 utf-8 BOM 的响应

转载 作者:行者123 更新时间:2023-12-02 05:30:05 34 4
gpt4 key购买 nike

在我的脚本中,我使用 cURL 发送数据,并启用了 CURLOPT_RETURNTRANSFER。响应是 json 编码的数据。当我尝试 json_decode 时,它​​返回 null。然后我发现response在字符串开头包含utf-8 BOM符号()。

有一些实验:


$data = $data = curl_exec($ch);
echo $data;

结果是{"field_1":"text_1","field_2":"text_2","field_3":"text_3"}

$data = $data = curl_exec($ch);
echo mb_detect_encoding($data);

结果 - UTF-8

$data = $data = curl_exec($ch);
echo mb_convert_encoding($data, 'UTF-8', mb_detect_encoding($data));
// identical to echo mb_convert_encoding($data, 'UTF-8', 'UTF-8');

结果 - {"field_1":"text_1","field_2":"text_2","field_3":"text_3"}


唯一有帮助的是删除前 3 个符号:

if (substr($data, 0, 3) == pack('CCC', 239, 187, 191)) {
$data = substr($data, 3);
}

但是如果会有另一个 BOM 怎么办?所以问题是:如何检测 cURL 响应的正确编码?或者如何检测 BOM 已经到达?或者如何使用 BOM 转换响应?

最佳答案

恐怕您已经自己找到了答案 - 这是个坏消息,因为据我所知没有更好的答案。

BOM 不应该在那里,发件人有责任不发送它。

但我可以向您保证,BOM 存在或不存在,如果存在,就是您知道的那三个字节。

您可以稍微快一点,并通过一个小改动处理另外 N 个 BOM:

$__BOM = pack('CCC', 239, 187, 191);
// Careful about the three ='s -- they're all needed.
while(0 === strpos($data, $__BOM))
$data = substr($data, 3);

第三方 BOM 检测器不会有任何不同。这样,即使稍后 cURL 开始剥离不需要的 BOM,您也能得到保护。

可能的原因

一些 JSON 优化器和过滤器可能会决定输出需要 BOM。此外,也许更简单的是,编写生成 JSON 的脚本的人无意中在开始的 PHP 标记之前包含了一个 BOM。 Apache 不关心 BOM 是什么,它看到开始标记之前有数据,因此将其发送并从 PHP 流本身隐藏它。这偶尔也会导致“无法添加 header :输出已经开始”错误。

内容检测

您可以验证 JSON 是有效的 UTF-8、BOM 还是非 BOM,但需要 mb_string 支持并且您必须使用严格模式来获取一些边缘情况:

if (false === mb_detect_encoding($data, 'UTF-8', true)) {
// JSON contains invalid sequences (erroneously NOT JSON encoded)
}

我会建议反对尝试纠正可能的编码错误;您可能会破坏自己的代码,并且还必须维护其他人的工作。

关于php - cURL 获取带有 utf-8 BOM 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12509855/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com