本文屬於 字符編碼系列文章之一,更多請前往 字符編碼系列。javascript
在JavaScrip中,進行一些GBK
或者UTF-8
編碼的字符操做時,打印出來的常常是亂碼,其緣由就是由於JavaScript固然內置編碼是UCS-2
(UTF-16的子集)。
因此弄懂JavaScript的內置編碼仍是頗有必要的,不然對於一些字符操做,如GBK和UTF-8轉換時就會模糊不清,沒法徹底理解。html
JavaScript使用哪種編碼java
關於UCS與Unicode的互相關係與影響這裏就不詳細介紹了,詳情能夠參考[【字符編碼系列】字符,字符集,字符編碼解惑web
有一點須要記住: UCS與Unicode的碼點是徹底一致的。segmentfault
0到0xFFFF的
0到0x10FFFF
。在UCS-2覆蓋的範圍內,UTF-16用2個字節來表示,其它字符用2個字節來表示也就是是說UTF-16取代了UCS-2,或者說UCS-2整合進入了UTF-16。因此如今通常只有UTF-16,沒有UCS-2。編碼
JavaScript最初使用的編碼是UCS-2設計
由於在JavaScript出現的時候,尚未UTF-16。code
因此,JavaScript誕生的時候,沒有選擇,只能使用UCS-2。htm
關於爲何不使用UTF-8,則是由於UCS-2編碼在內存方面的操做及使用效率會更高blog
因爲JavaScript只能處理UCS-2編碼,形成全部字符在這門語言中都是2個字節,若是是4個字節的字符,會看成兩個雙字節的字符處理。
因此,遇到自己應該用4個字節表示的字符時,JavaScript讀出來就會不許確,甚至亂碼。
例如:亖
這個字符爲例,它的UTF-16編碼是4個字節的0xD834 DF06。
4個字節的編碼不屬於UCS-2,JavaScript不認識,只會把它看做單獨的兩個字符U+D834和U+DF06。這兩個碼點是空的,因此JavaScript會認爲亖
是兩個空字符組成的字符串!
以上使用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