主要参考
- 字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志
- Unicode与JavaScript详解 - 阮一峰的网络日志
- 阮一峰老师文章的常识性错误之 Unicode 与 UTF-8 - FooFish-Python之禅
ASCII 与 Unicode
ASCII 编码
- 上世纪六十年代,美国制定的一套字符编码,将英文字符与计算机能够识别的二进制值做了统一转换规定;
- ASCII 码中共规定了128个字符(包括32个控制符号)的编码,仅占用一个字节的后7位,首位统一为0
Unicode 字符集
- ASCII 码中规定的128个字符无法满足世界上各种语言的输入需求,为尽可能容纳世界上所有的文本符号,避免编码冲突,制定了 Unicode;
- Unicode 现有规模可容纳100多万个符号,可能需要1-3个字节来唯一表示(实际范围:U+0000 - U+10FFFF);
- 基于 Unicode 字符集有多种编码实现,主要规定了二进制码的具体存储方式
基于 Unicode 的常见编码方式
UTF-8
目前互联网上最常见的网页编码方式;
变长编码方式,字符长度可能为1-4个字节;
编码规则(字母
x
表示可用的编码位)- 对于单字节符号,首位为0,后7位为Unicode码(ASCII码中规定的128个字符与此处一致);
- 对于n字节符号(n>1),首字节的前n位为1,第n+1位为0,后面字节的前两位一律为10;剩余二进制位表示Unicode码
UTF-32
最直观的编码方式,完全对应Unicode字符集,查找效率高(时间复杂度o(1));
定长编码方式,字符长度位4个字节;
浪费空间,HTML5中明文规定,网页不得编码为UTF-32
UTF-16
结合定长和变长两种编码方式;
基本平面字符(U+0000 - U+FFFF)占用2个字节;
辅助平面字符(U+010000 - U+10FFFF)占用4个字节;
区分基本平面字符与辅助平面字符:
基本平面内预留一个空段(U+D800 - U+DFFF),共2^11空间大小;
将辅助字符(U+010000 - U+10FFFF)二进制编码的前10位(高位H)映射至U+D800 - U+DBFF(空间大小2^10),后10位(低位L)映射至U+DC00 - U+DFFF(空间大小2^10);
按照2个字节读取字符码点,当值处于U+D800 - U+DBFF之间时,基本平面内无对应字符,表示需结合后2个字节作为一个辅助平面字符码点读取
UCS-2
ISO/IEC 10646 编码体系内的一种编码方式(区别于 Unicode 编码体系),后两种编码体系合并,UCS-2 整合进 UTF-16;
实质就是 UTF-16 中的基本平面字符表示(2个字节),而 UTF-16 在 UCS-2 后发布,并明确宣布是 UCS-2 的超集(基本平面字符沿用 UCS-2 编码,扩展辅助平面字符并定义4字节表示法);
JavaScript 的编码方式,因此 JavaScript 仅支持基本平面字符(2个字节)