當使用時,編碼爲JSON他們出來怪異垃圾「特殊」的Unicode字符:參考:爲什麼我的「特殊」Unicode字符使用json_encode編碼很奇怪?
php > echo json_encode(['foo' => '馬']);
{"foo":"\u99ac"}
爲什麼?我的編碼是否做錯了?
(這是一個參考的問題澄清的話題一勞永逸,因爲這一次又一次的出現。)
當使用時,編碼爲JSON他們出來怪異垃圾「特殊」的Unicode字符:參考:爲什麼我的「特殊」Unicode字符使用json_encode編碼很奇怪?
php > echo json_encode(['foo' => '馬']);
{"foo":"\u99ac"}
爲什麼?我的編碼是否做錯了?
(這是一個參考的問題澄清的話題一勞永逸,因爲這一次又一次的出現。)
首先:沒有什麼錯在這裏。這是字符可以如何在JSON中編碼。它在the officialstandard。它是基於如何能夠在
的Javascript
的ECMAScript(section 7.8.4 "String Literals")來形成字符串和被描述爲這樣:
任何碼點可被表示爲十六進制數。這個數字的含義由ISO/IEC 10646確定。如果代碼點位於基本多語言平面(U + 0000至U + FFFF)中,則它可以表示爲六個字符的序列:反向固定點,接着是小寫字母u,接着是四個十六進制數字,用於編碼代碼點。 [...]因此,例如,一個只包含一個反向固體角色字符的字符串可以表示爲「\ u005C」。
簡而言之:任意字符可以被編碼爲\u....
,其中....
是字符(或代碼點UTF-16代理對的一半,爲BMP之外的字符)的統一代碼點。
"馬"
"\u99ac"
這兩個字符串文字表示完全一樣的人物,他們是絕對等同。當這些字符串文本被兼容的JSON解析器解析時,它們都會導致字符串「馬」。他們沒有外觀相同,但他們意味着在JSON數據編碼格式相同的東西。
PHP的json_encode
最好使用\u....
轉義序列編碼非ASCII字符。從技術上講,它不一定,但它確實。結果是完全有效的。如果你喜歡有文字字符在你的JSON而不是轉義序列,您可以設置JSON_UNESCAPED_UNICODE
標誌在PHP 5.4或更高版本:
php > echo json_encode(['foo' => '馬'], JSON_UNESCAPED_UNICODE);
{"foo":"馬"}
要強調的是:這只是一個偏好,它不是必需的任何在JSON中傳輸「Unicode字符」的方法。
注:json是[ecma 404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf),而不是ecma 262(javascript)。也可以將非BMP的Unicode碼點表示爲UTF-16替代碼對,例如,[跳動的心臟--U + 1F493](http://codepoints.net/U+1f493)爲'「\ ud83d \ udc93」'爲json串。 – jfs
+1。在[JavaScript中所有可能的轉義序列](http://mathiasbynens.be/notes/javascript-escapes)中,JSON僅支持一些[單字符的轉義序列,如'\ n'](http:// mathiasbynens。 be/notes/javascript-escapes#single)和所謂的[Unicode轉義序列](http://mathiasbynens.be/notes/javascript-escapes#unicode)。 –
如果您使用ECMAscript以外的語言使用JSON,則更好的參考可能是RFC 7159(http://tools.ietf.org/html/rfc7159),它與ECMA-404一致。 –