【问题标题】:Handling non UTF-8 data in JSON file处理 JSON 文件中的非 UTF-8 数据
【发布时间】:2019-06-24 18:58:41
【问题描述】:

我正在从某个位置获取 JSON 文件并将内容传递到我的前端。为此,我有如下内容

return response()->json(json_decode(file_get_contents('some/path', true)));

但是,有时我注意到由于格式错误的 utf-8 字符而失败。我查看了 JSON 文件,并注意到有时像 £ 符号这样的东西被表示为一个奇怪的符号,例如

{
  "ID": "123",
  "Date": "08/06/2012",
  "Amount": "�120.59"
}

处理这种情况的最佳方法是什么?目前,我正在尝试类似以下的方法

$data = file_get_contents('some/path', true);
$encoding = mb_detect_encoding($data, mb_detect_order(), true);
if($encoding !== "UTF-8") {
    return response()->json(json_decode(utf8_decode($data)));
}
return response()->json(json_decode($data));

这似乎可行,但不确定它是否是最好的方法?我检查它是否是 UTF-8 的原因是因为如果我尝试在已经是 UTF-8 的东西上使用 utf8_decode,它会失败。

这是处理 JSON 文件中奇怪字符的最佳方法吗?

谢谢

【问题讨论】:

  • 不是UTF8的时候使用什么编码?因为utf8_encode() 只编码 ISO-8859-1。 mb_convert_encoding() 可以做得更多。
  • 说实话我不知道。当没有有趣的字符时,它似乎是 UTF-8。当有搞笑字符时,detect_encoding 返回 false
  • mb_detect_encoding() 可能返回 false,因为 $data 的位太小而无法检测编码,但它知道它不能是 UTF-8。我无法判断您的情况,但找出编码的真正含义是有意义的。我怀疑似乎是 UTF-8 的位使用相同的编码但缺少非 UTF-8 字符。因此,如果您知道真正的编码,您就可以正确处理所有数据。
  • 如果不是一些敏感信息,您可以在这里发布示例 JSON 文件吗?我说的是发布完整文件,而不是复制粘贴——这会删除大部分有趣的信息,如 BOM(UTF 标头)等。

标签: php json utf-8


【解决方案1】:

根据定义,JSON 是 UTF-8 - 因此您应该使用 UTF-8:所有 PHP 脚本都应该是 UTF-8,任何数据库表,当然还有脚本和数据库之间的通信通道,最后是输出。

如果您实现了这一点,您的问题将自动消失...不再需要转换。

【讨论】:

  • 唯一的问题是我不控制 JSON 文件,我只是从另一台服务器获取它。我在看 json_decode,这是一个选择吗? return response()->json(json_decode($data, true, 512, JSON_INVALID_UTF8_IGNORE));
  • 如果您收到带有无效符号的 JSON,则说明创建者搞砸了……在这种情况下,您可能几乎没有机会恢复原始文件(取决于之前的转换方式)。如果可以的话,请创建者自己检查一下...
猜你喜欢
  • 2018-01-25
  • 2011-11-07
  • 2011-02-23
  • 2012-07-27
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多