浅析字符编码发展
2019-08-14 本文已影响0人
临安linan
字符编码的发展历史
1. 存储英文数字标点的ASCII
最开始普遍使用的是ASCII码:
它把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号
后来, 128-255号都被扩展完了, 没法扩展了
2. 中国发明的汉字字符编码方案
从GB2312到GBK到GB18030, 总算容纳了所有汉字, 但是这个时候各个国家都像中国这样自己搞一套编码, 谁也不认识谁
3. 包罗万象的Unicode字符集
unicode是字符集, 是字符的集合, 不同于编码方案
unicode目标是容纳世界上所有的字符, 统一用至少两个字节表示字符
在unicode中中文也是两个字节表示的
缺点也很明显:
-
原本ASCII码只需八位表示, unicode直接弄成16位, 高八位闲置为0, 导致文本大小过大
-
unicode表示的字符可能是2个字节, 也可能是3个字节, 计算机怎么分的清楚到底是几字节?
4. 可变长度的UTF-8编码
UTF-8采取8位传输数据, 它是一种变长的编码方式。
它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示
UTF-8编码规则:
0xxxxxxx // 单字节, 第一位固定为0
110xxxxx 10xxxxxx // 多字节, 第一个字节前面的1的个数表示字节数, 后面固定一个0, 后面的字节开头固定为10
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
可见, UTF-8采取了标志位, 提高了编码的可读性
注意: 在unicode中一个汉字两个字节, 但在UTF-8中一个汉字三个字节, 他们间的转换需要一定的算法规则
从Unicode字符集到UTF-8, 英文短了, 但每个汉字却多用了一个字节, 这也是到今天GBK等编码方案还能沿用的重要原因(存储汉字小啊(▽))
JavaScript中的编码函数:
encodeURI: 它输出字符的UTF-8编码, 并且在每个字节前加上%
decodeURI: 与encodeURI对应, 用作解码