unicode 与 utf-8
unicode
计算机的世界是二进制的世界,无论文字音频传输存储之时都要落实到二进制上。而起源于西方的计算机技术自然深根于他们的文化,于是最初的ascii码基本只是西方的文字编码集。随着计算机的普及,各个国家各个民族基本都为自己的文字创立了字符集。多而杂的规则为数据的传输交换带来巨大困难。是时候要统一字符集了。
unicode应运而生。unicode旨在为所有字符统一编码。
unicode的UCS2标准用两个字集,16位来表示字符,因此它的容量是216个。
uft-8
在大家都使用unicode的时候,英文字母和符号由原本ascii下的一个字节变成两个字节,这无疑是一种浪费。于是UTF(unicode transfer format)这种变长编码又出现了,它专门为传输而设计。unicode相当一个map,为每个字符赋一个编码。而utf则对这些编码再次编码,以便于传输存储。utf-8表示8位的编码格式,还有uft-16,utf-32。
unicode与uft-8之间的转换关系
unicode编码为utf-8时规则如下:
- 对于0-127之间的编码,以一个字节表示,即其二进制编码。
- 128及以上,如果编码后的uft-8是n个字节,则第一个字节的编码起始为连续的n个1和一个0,后续字节皆以10开头,剩余部分才是存放真实值的地方,这里说的n个1+0 和 10就像是来描述协议的暗号一样。
unicode 编码范围(binary) | uft-8(binary) |
---|---|
0~0111 1111 | 0xxx xxxx |
0000 1000 0000 ~ 0111 1111 1111 | 110x xxxx 10xx xxxx |
0000 1000 0000 0000 ~ 0111 1111 1111 1111 | 1110 xxxx 10xx xxx 10xx xxxx |
utf-8以八个字节为一个单位编码,其中字节符合 ^1{2,}0 规则的是开始字节,一个开始字节后面跟的随1-6个辅助字节,每个辅助字节以10开头,所以可以承载的信息是6位。那么我们可以轻易计算出utf-8各个变长编码组的容量范围:
- 一个n个字集编码的 utf-8 的有效位是 (8-n-1)+n*6,得出上限值M。
2.用1的方式计算出 n-1 个字集编码表达的上限N。
所以n个utf-8字节编码表达的unicode值范围是,N+1~M。经计算:
utf-8 字节数(dec) | 编码值范围(dec) |
---|---|
1 | 0-127 |
2 | 128-2047 |
3 | 2048-65535 |
4 | 65536-2097151 |
举一个例子来描述这种转换规则:
汉字“中”的unicode编码十六进制数为:4e2d,十进制为:20013, 二进制为:0100 1110 0010 1101,区间在2048-65535,所以是三个字节。
所以将其二进制填充进 1110 xxxx 10xx xxx 10xx xxxx的x中,得出的结果是1110 0100,1011 1000,1010 1101。得出utf-8十六进制为 e4 b8 ad。
javascript中的unicode和utf-8
js中escape是对字符进行unicode编码,而encodeURI和encodeURIComponent是utf-8编码。