【字符編碼系列】JavaScript使用的編碼-UCS-2

寫在前面的話

本文屬於 字符編碼系列文章之一,更多請前往 字符編碼系列javascript

在JavaScrip中,進行一些GBK或者UTF-8編碼的字符操做時,打印出來的常常是亂碼,其緣由就是由於JavaScript固然內置編碼是UCS-2(UTF-16的子集)。
因此弄懂JavaScript的內置編碼仍是頗有必要的,不然對於一些字符操做,如GBK和UTF-8轉換時就會模糊不清,沒法徹底理解。html

大綱

  • UCS-2和UTF-16的區別
  • JavaScript使用哪種編碼java

    • 爲何選用UCS-2
    • UCS-2的侷限
    • 特別注意ES6

UCS-2和UTF-16的區別

關於UCS與Unicode的互相關係與影響這裏就不詳細介紹了,詳情能夠參考[【字符編碼系列】字符,字符集,字符編碼解惑web

有一點須要記住: UCS與Unicode的碼點是徹底一致的。segmentfault

發佈時間上的區別

  • UCS-2是UCS組織開發的,於1990年公佈
  • UTF-16是Unicode組織開發的,與1996年7月公佈

編碼的區別

  • UCS-2是一種定長的編碼方式,用兩位字節來表示一位碼位,碼位範圍爲: 0到0xFFFF的
  • UTF-16是一種變長編碼,它兼容UCS-2,同時能夠表示UCS-2沒法表示的碼位,範圍爲:0到0x10FFFF。在UCS-2覆蓋的範圍內,UTF-16用2個字節來表示,其它字符用2個字節來表示
  • 在常見的字符碼位中,UCS-2和UTF-16能夠認爲是同一個意思

總結

  • UTF-16是UCS-2的超集

也就是是說UTF-16取代了UCS-2,或者說UCS-2整合進入了UTF-16。因此如今通常只有UTF-16,沒有UCS-2。編碼

JavaScript使用哪種編碼

JavaScript最初使用的編碼是UCS-2設計

爲何使用UCS-2而不是UTF-16

由於在JavaScript出現的時候,尚未UTF-16。code

  • 1990年公佈UCS-2
  • 1995年5月,Brendan Eich用了10天設計了JavaScript語言
  • 10月,第一個解釋引擎問世
  • 1996年11月,Netscape正式向ECMA提交語言標準
  • 1996年7月公佈UTF-16

因此,JavaScript誕生的時候,沒有選擇,只能使用UCS-2。htm

關於爲何不使用UTF-8,則是由於UCS-2編碼在內存方面的操做及使用效率會更高blog

UCS-2的侷限

因爲JavaScript只能處理UCS-2編碼,形成全部字符在這門語言中都是2個字節,若是是4個字節的字符,會看成兩個雙字節的字符處理。

因此,遇到自己應該用4個字節表示的字符時,JavaScript讀出來就會不許確,甚至亂碼。

例如:這個字符爲例,它的UTF-16編碼是4個字節的0xD834 DF06。
4個字節的編碼不屬於UCS-2,JavaScript不認識,只會把它看做單獨的兩個字符U+D834和U+DF06。這兩個碼點是空的,因此JavaScript會認爲是兩個空字符組成的字符串!

特別注意ES6

以上使用UCS-2的JavaScript只針對於ES5及之前的版本。
對於ES6及之後的JavaScript,是支持識別4個字節碼點的。

也就是說: ES6及其之後的JavaScript能夠認爲內置編碼是UTF-16

tips: 是否支持ES6由具體的實現引擎決定

附錄

博客

初次發佈2017.05.30於我的博客

http://www.dailichun.com/2017/05/30/javascriptInnerCharEncoding.html

參考資料

相關文章
相關標籤/搜索