当使用“特殊”Unicode 字符时,它们在编码为 JSON 时会变成奇怪的垃圾:
php > echo json_encode(['foo' => '馬']);
{"foo":"\u99ac"}
为什么?我的编码有问题吗?
(This is a reference question to clarify the topic once and for all, since this comes up again and again.)
首先:这里没有什么问题。人物是这样的can以 JSON 形式编码。它是在官方 http://www.json.org standard http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf。它基于如何在 Javascript ECMAScript 中形成字符串文字(第 7.8.4 节“字符串文字” http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)并描述如下:
任何代码点都可以表示为十六进制数。这种数字的含义由 ISO/IEC 10646 确定。如果代码点位于基本多语言平面(U+0000 到 U+FFFF)中,则它可以表示为六字符序列:反斜线、后面跟着小写字母 u,再后面是编码代码点的四个十六进制数字。 [...] 因此,例如,仅包含单个反斜线字符的字符串可以表示为“\u005C”。
简而言之:任何字符都可以编码为\u....
, where ....
是字符的 Unicode 代码点(对于 BMP 之外的字符,是 UTF-16 代理项对的一半的代码点)。
"馬"
"\u99ac"
这两个字符串文字代表完全相同的字符,它们绝对等效。当这些字符串文字被兼容的 JSON 解析器解析时,它们都会生成字符串“马”。他们不look一样,但是他们meanJSON 数据编码格式也是如此。
PHP's json_encode http://php.net/json_encode最好使用编码非 ASCII 字符\u....
转义序列。从技术上讲,它不必这样做,但确实如此。结果是完全有效的。如果您希望在 JSON 中使用文字字符而不是转义序列,则可以设置JSON_UNESCAPED_UNICODE
PHP 5.4 或更高版本中的标志:
php > echo json_encode(['foo' => '馬'], JSON_UNESCAPED_UNICODE);
{"foo":"馬"}
强调一下:这只是一个偏爱,没有必要以任何方式在 JSON 中传输“Unicode 字符”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)