2014-03-30 64 views

回答

18

首先:沒有什麼錯在這裏。這是字符可以如何在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字符」的方法。

+5

注: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

+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)。 –

+2

如果您使用ECMAscript以外的語言使用JSON,則更好的參考可能是RFC 7159(http://tools.ietf.org/html/rfc7159),它與ECMA-404一致。 –