参考:为什么我的“特殊的”Unicode字符使用json_encode编码奇怪?

当使用“特殊的”Unicode字符时,当它们编码为JSON时,它们会出现怪异的垃圾:

php > echo json_encode(['foo' => '馬']); {"foo":"\u99ac"} 

为什么? 我的编码做错了吗?

(这是一个参考性的问题,一劳永逸地澄清这个话题,因为这个问题一再出现。)

首先: 这里没有错。 这是如何在JSON中编码字符的。 这是在官方的 标准 。 它基于如何在Javascript ECMAScript中形成string文本( 第7.8.4节“string文字” ),并且被描述为:

任何代码点可以表示为一个hex数字。 这个数字的含义是由ISO / IEC 10646确定的。如果代码点在基本多语言平面(U + 0000到U + FFFF)中,那么它可以表示为六个字符的序列:反向固定,接着是小写字母u,接着是四个hex数字,用于编码代码点。 因此,例如,只包含一个反向立体angular色字符的string可以表示为“\ u005C”。

简而言之:任何字符都可以被编码为\u.... ,其中....是字符的Unicode代码点(或者代表一个UTF-16代理对的一半的代码点,用于BMP之外的字符) 。

 "馬" "\u99ac" 

这两个string文字表示完全相同的字符,它们是完全相同的。 当这些string文本被兼容的JSONparsing器parsing时,它们都将导致string“马”。 他们看起来不一样,但他们的意思是在JSON数据编码格式相同的东西。

PHP的json_encode最好使用\u....转义序列编码非ASCII字符。 从技术上讲,这并不是必须的,但它确实如此。 结果是完全有效的。 如果您希望在JSON中使用文字字符而不是转义序列,则可以在PHP 5.4或更高版本中设置JSON_UNESCAPED_UNICODE标志:

 php > echo json_encode(['foo' => '馬'], JSON_UNESCAPED_UNICODE); {"foo":"馬"} 

要强调的是:这只是一个偏好 ,在JSON中不必以任何方式传输“Unicode字符”。