【问题标题】:PHP json_decode function just work UTF-8 encoded strings?PHP json_decode 函数只能工作 UTF-8 编码的字符串?
【发布时间】:2013-12-17 17:47:06
【问题描述】:

Here你可以读到json_decode函数

仅适用于 UTF-8 编码的字符串。

那么为什么以下几行会导致不同的输出?

echo utf8_decode('1ñ2'), "\n";
echo json_decode('"' . '1ñ2' . '"'), "\n";

'ñ' 字符不是有效的 UTF-8 字符,即使 json_decode 在将该字符传递到它必须解码的字符串时也不会抱怨。

【问题讨论】:

  • "ñ" 实际上是一个有效的 UTF-8 字符。我没有明白这里有什么问题,因为这些功能做不同的事情。这是每个人的预期结果。
  • "ñ" 必须表示为多字节字符,因为它设置了最高有效位,因此 UTF-8 字符是 'ñ2',这不是有效的 UTF-8。跨度>

标签: php unicode utf-8 json


【解决方案1】:

那是因为这两个函数在做完全不同的事情。 json_decode() 保持字符编码不变(utf-8),只是将 json 数据解析为 PHP 结构,utf8_decode() 将字符编码转换为 ISO-8859-1。但 ISO-8859-1 不知道那种特殊的多字节字符。

【讨论】:

  • 感谢您的回复。我同意这些函数做了完全不同的事情,我阅读了文档;)我的观点是字符串 '1ñ2' 不是有效的 UTF-8 字符串(多字节字符 'ñ2' 不是有效的 UTF- 8个字符),这就是为什么utf8_decode“抱怨”,那么为什么json_decode()不抱怨呢?在我看来,json_decode() 根本不需要文档所说的字符串是 UTF-8,可能只需要 JSON 关键字符是 UTF-8 编码。
  • 如果不是utf-8,那是什么类型的编码? AFAIK utf-8 定义了世界上任何现有的字符(以及更多:) ..
  • LOL 这很简单,反正我会清除它:“有效的 UTF-8 字符串”=“正确编码的 UTF-8 字符串”和 '1ñ2' 不是正确编码的 UTF-8 字符串,即这就是为什么utf8_decode 函数抱怨的原因。 '1ñ2' = '00110001 11000011 00110001' 并且最后 16 位不构成有效的多字节 UTF-8 字符,因为最后 8 位必须以 '10' 开头。 PS:我不是 Unicode 专家。
  • 需要调试这个。目前很懒:)
猜你喜欢
  • 2014-06-09
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多