提问人:deceze 提问时间:3/30/2014 更新时间:8/25/2014 访问量:3928
参考资料:为什么我的“特殊”Unicode 字符使用 json_encode 编码很奇怪?
Reference: Why are my "special" Unicode characters encoded weird using json_encode?
问:
当使用“特殊”Unicode字符时,当编码为JSON时,它们会变成奇怪的垃圾:
php > echo json_encode(['foo' => '馬']);
{"foo":"\u99ac"}
为什么?我的编码有问题吗?
(这是一个参考问题,可以一劳永逸地澄清这个话题,因为它一次又一次地出现。
答:
首先:这里没有错。这就是在 JSON 中对字符进行编码的方式。它属于官方标准。它基于 Javascript ECMAScript 中字符串文字的形成方式(第 7.8.4 节 “字符串文字”),并描述如下:
任何代码点都可以表示为十六进制数。该数字的含义由 ISO/IEC 10646 确定。如果代码点位于基本多语言平面(U+0000 到 U+FFFF)中,则可以表示为六个字符的序列:反向实线,后跟小写字母 u,后跟对码位进行编码的四个十六进制数字。[...]因此,例如,仅包含单个反向实线字符的字符串可以表示为“\u005C”。
简而言之:任何字符都可以编码为 ,其中是字符的 Unicode 码位(或 UTF-16 代理项对的一半码位,对于 BMP 之外的字符)。\u....
....
"馬"
"\u99ac"
这两个字符串文本表示完全相同的字符,它们是绝对等效的。当这些字符串文字由兼容的 JSON 解析器解析时,它们都将生成字符串“馬”。它们看起来不一样,但它们在 JSON 数据编码格式中的含义相同。
PHP 的json_encode
最好使用转义序列对非 ASCII 字符进行编码。从技术上讲,它不一定是,但它确实如此。结果是完全有效的。如果您希望在 JSON 中使用文字字符而不是转义序列,您可以在 PHP 5.4 或更高版本中设置标志:\u....
JSON_UNESCAPED_UNICODE
php > echo json_encode(['foo' => '馬'], JSON_UNESCAPED_UNICODE);
{"foo":"馬"}
需要强调的是:这只是一种偏好,没有必要以任何方式在 JSON 中传输“Unicode 字符”。
评论
"\ud83d\udc93"
评论