【字符编码系列】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

参考资料

相关文章
相关标签/搜索