2012-01-03 52 views
23

我在某些地方看過JavaScript字符串是UTF-16,在其他地方他們是UCS-2。我做了一些四處搜尋,試圖找出差異,並發現:JavaScript字符串 - UTF-16與UCS-2?

問:UCS-2和UTF-16有什麼區別?答:UCS-2是一種過時的術語,它指的是在代用品代碼點之前一直到Unicode 1.1的Unicode 實現,以及在標準的2.0版本中添加了UTF-16之前的 。現在應避免使用此術語 。

UCS-2沒有定義不同的數據格式,因爲UTF-16和UCS-2 對於數據交換的目的是相同的。兩者都是16位的,並且具有完全相同的代碼單元表示的 。

有時在過去,一個實現標記爲「UCS-2」爲 ,表示它不支持補充字符,而不是 將替代碼點對解釋爲字符。這種 實現將不處理字符屬性的處理, 代碼點邊界,校對等等的補充字符。

通過

http://www.unicode.org/faq/utf_bom.html#utf16-11

所以我的問題是,是不是因爲JavaScript字符串對象的方法和指標作用於16位數據值,而不是人物什麼讓一些人認爲這是UCS-2?如果是這樣,一個圍繞字符而不是16位數據塊的JavaScript字符串對象會被認爲是UTF-16嗎?還是有什麼我失蹤?

編輯:按照要求,這裏有一些人士說的JavaScript字符串是UCS-2:

http://blog.mozilla.com/nnethercote/2011/07/01/faster-javascript-parsing/ http://terenceyim.wordpress.com/tag/ucs2/

編輯:對於任何人誰可能會遇到這種情況,請看看這個鏈接:

http://mathiasbynens.be/notes/javascript-encoding

回答

18

JavaScript,嚴格來說,ECMAScript,預編日期爲Unicode 2.0,因此在某些情況下,您可能會發現對UCS-2的引用,因爲在編寫引用時這是正確的。你能否指出我們對JavaScript的具體引用是「UCS-2」?

規格的ECMAScript版本3和5的至少兩個顯式地聲明一個字符串是一個收集無符號的16位整數,並且如果那些整數值被用來代表文本數據,那麼它們是UTF-16代碼單元。請參閱the ECMAScript Language Specification的第8.4節。


編輯:我不再肯定我的回答是完全正確的。看到上面提到的優秀文章,http://mathiasbynens.be/notes/javascript-encoding,其實質上是說,儘管JavaScript引擎可以在內部使用UTF-16,並且大多數情況下,語言本身有效地將這些字符公開爲UCS-2。

+0

謝謝你的鏈接,規範的語言似乎很清楚。那麼我認爲,UCS-2談話要麼是舊的,要麼是基於代理對的方法和索引支持。 – patorjk 2012-01-03 18:23:43

+0

因此,規範規定:「序列中的每個整數值通常代表UTF-16文本的單個16位單元,但ECMAScript不對該值施加任何限制或要求,但它們必須是16位無符號整數。「,這相當於在現代C程序中,字符數組中的每個字符值」通常「表示UTF-8文本的單個8位單元,但顯然聲明C字符串」是「UTF-8將是錯誤。 JavaScript提供的語義只有UCS-2;如果你想要UTF-16的支持,你必須自己做,如DMoses的答案。 – 2012-12-11 04:34:29

+0

UCS是數字,UCS 2是過時的,當前版本是UCS 4. UTF-8/-16/-32是以位表示UCS數組的數組的方式。 ;) – Philip 2017-06-11 09:27:21

8

這是UTF-16/UCS-2。它可以處理代理對,但charAt/charCodeAt返回16位字符而不是Unicode代碼點。如果你想讓它處理代理對,我建議快速閱讀this

+0

你是什麼意思「它可以處理代理對」? – cubuspl42 2015-10-22 21:48:22

+0

如果你閱讀了鏈接的文章,它將描述如何讓它處理代理對。我的觀點是,它默認不會出錯,並且有辦法處理代理對,如所提供鏈接的代碼所示。 – 2015-10-23 19:30:02

+1

@ cubuspl42 UTF-16不限於0x0-0xFFFF,它可以對16位字符對進行編碼,並且代表整個Unicode範圍,從超過一百萬個碼點的0x0-0x101000。這些對稱爲「代理對」。 – doug65536 2017-01-22 12:20:14