常见的网页设计编码:Unicode的UCS-2 UCS-4 UTF-8 UTF-16 UTF-32以及ASCII和ANSI。
要知道JS最初定稿时使用的编码是UCS-2(因为那时候还没UTF-16,本质:UTF-16就是对UCS-2的扩展,前面的65536个字符就是UCS-2本身,后面的一直到10FFFF编号的字符是UTF-16新增的字符集),后来的ES6标准中加入了对UTF-16的支持。
题外话:现在已经没有UCS编码了,UCS的组织是ISO(国际标准化组织),而Unicode是多个多语言软件公司组成的一个组织,他们最后都同意整合各自的编码规则使世界字符编码规则趋于统一。最后的统一世界编码的项目名便是Unicode,UCS-2是旧时对65536个字符的统一编码的解决方案,而UCS-4是对到10FFFF编号的字符解决方案,UTF-32就是UCS-4(始终用4字节来存储字符),变了个新名字而已。UTF-8和16有对应的各自编码转换规则,这里就不说了。GBK的话就是编码序号对应每个汉字(一对一查表,无法通过计算获取对应字符,是地方语言编码规则,仅限在中国大陆使用),无对应的转换规则可用。再说一下UTF-16代理对的含义,在UTF-16中为了要表示剩下的16个平面字符(UTF-16范围是到10FFFF为止的,共17个平面),在基本平面的D800~DFFF这些码点设为代理,一共可以代理1024的平方个,正好是剩下的16个平面的范围。另外,如果出现ANSI的编码,说明该编码从ASCII扩展过来,比如你在中文操作系统中,在ASCII编码的文件中输入了汉字(即超出ASCII范围的字符)那么ASCII自动扩展为ANSI,在这里即GBK,如果是繁体中文操作系统那么ANSI即BIG5。
以下有"-ES6"标记的函数是ES6标准新加进来的。
String.fromCodePoint(十进制的utf-16); -ES6 //返回基本数据类型,字符串
String.fromCharCode(十进制的UCS-2); //返回基本数据类型,字符串
stringObj.charAt(index); //返回基本数据类型,字符串
stringObj.charCodeAt(index); //返回十进制的该字符UCS-2值
stringObj.codePointAt(index); -ES6 //返回十进制的UTF-16值,然后该Index不是代理对直接返回这个字符UTF-16值
stringObj.at(index); -ES6 //对UTF-16字符的charAt()实现
\u{....} 用来表示UTF-16字符的Unicode引用
/..../u 用来向正则表达式说明该模式编码为UTF-16
附一个UTF-8转码范围表:
Unicode范围: | 位数: | UTF-8 | 字节: | 备注: |
0000~007F | 0~7 | 0XXX XXXX | 1 | 标准ASCII码 |
0080~07FF | 8~11 | 110X XXXX 10XX XXXX {1} | 2 | 除东亚的基本世界字符(东亚字符占世界所有字符的70%) |
0800~FFFF | 12~16 | 1110 XXXX 10XX XXXX {2} |
3 | 基本平面:0~FFFF |
1 0000~1F FFFF | 17~21 | 1111 0XXX 10XX XXXX {3} |
4 | Unicode6.1定义的范围:0~10 FFFF(1 16个平面) |
20 0000~3FF FFFF | 22~26 | 1111 10XX 10XX XXXX {4} |
5 | |
400 0000~7FFF FFFF | 27~31 | 1111 110X 10XX XXXX {5} | 6 | 通用字符集的极限 |
字符串"a我易":
UTF-8:(61)( E6 88 91)( E6 98 93)
UTF-8 BOM:(EF BB BF)( 61)( E6 88 91)( E6 98 93)
ANSI(GBK):(61)( CE D2)( D2 D7)
UCS-2:(FF FE)( 61 00)( 11 62)( 13 66)
UCS-2 BE:(FE FF)( 00 61)( 62 11)( 66 13)
UTF-16:(FF FE)( 61 00)( 11 62)( 13 66)
UTF-16 BE:(FE FF)( 00 61)( 62 11)( 66 13)
UTF-32:(FF FE 00 00)( 61 00 00 00 )(11 62 00 00 )(13 66 00 00)
UTF-32 BE:(00 00 FE FF)( 00 00 00 61 )(00 00 62 11)( 00 00 66 13)
字符串"a我\u{1D306}",其中\u{1D306}是一个非基本平面的字符,该字符为:?(有些浏览器可能不支持显示该字符,正常显示的话,该字符类似汉字“三”多一横)
UTF-8:(61)( E6 88 91)( F0 9D 8C 86)
UTF-16:(FF FE )(61 00 )(11 62 )(34 D8 06 DF)
UTF-32:(FF FE 00 00)( 61 00 00 00)( 11 62 00 00)( 06 D3 01 00)