从计算机的根上学习字符集

字符集基本概念

  • 字符:是计算机世界里关于文字符号的总称;包括文字,标点,数字,图形符号等;例如一个汉字,一个字母,一个逗号。
  • 字符集:一个字符集就是多个字符的有序集合。好比一本字符字典,每个国家字符类型不同,个数也不同,常见的字符集有ASKII字符集,Unicode字符集,GB2312字符集。
  • 字符编码:由于计算机只能识别二进制的0和1,字符集中的字符,计算机是不能识别的,所以要将字符集转化为计算机可以识别的二进制,这个转化的过程就是字符编码。简单可以认为是将字符集中字符所对应的十进制编号转化为二进制,以便让计算机识别。

小提示
不要将字符与字节搞混,字符是文化符号,而字节是一个长度单位。
使用不同字符集编码相同的字符内容,所产生的文件大小也是不一样的。

ASK码字符集

ASKⅡ编码:美国标准信息互换码。
在这里插入图片描述
最初的这套编码只被标识,大写英文字母,小写英文字母,数字0到9,所有英文的标点符号,数学运算符,以及一些特殊字符。把所有的这些字符加起来,总共也不超过128个字符。128是2的7次方,所以计算机利用7个bit位就能标识所有字符。后来IMB在此基础上又扩充了一些字符,就形成了现在的用8个bit位标识所有字符,也就是能标识2的8次方256个字符。
在这里插入图片描述

ASK码是单字节码,每个字符用8个bit位一个字节就能表示

GB2312

GB2312:简体中文编码表。
由于ASK编码,只能标识256个西方文化符号,当中国人用的时候,已经没有可用的字节状态来表示汉字,况且中文光常用的文字就有6000多个。因此中国在ASK码的基础之上进行了扩展。前127个单字符编码不变,127以后用两个字节16个bit位,来表示一个字符。一个汉字用两个字节标识,2的16次方是65535,大大提高了汉字字符个数,开始字符集中只有6763个汉字,后来经过扩展又添加了2万个汉字,形成了后来的GBK编码。

Unicode字符集

Unicode字符集:万国码,统一字符集。
由于世界各国都像中国一样,各自有一套自己标准的字符集,而且相互之间谁也不懂谁的编码,无法做到跨平台,跨语言的支持,所以ISO(国际标准化组织)为了适应全球化的发展,开始着手解决编码不统一的问题,舍弃了所有地区性编码方案,重新搞了一套包括世界上所有文化,字母,符号的编码,统一字符集,简称unicode。

Unicode字符集的特点

  • Unicode字符集中,规定必须用两个字节,也就是16位来统一表示所有字符。ASK码中的字符在Unicode中保持不变,长度由8位扩展到16位。高八位用0补齐,所以此方案保存英文文本时会浪费一些空间。
  • Unicode是用两个字节来标识一个字符,总共可以包含65535个不同字符。
  • Unicode字符集中包含中文字符20902个,第一个是汉字"一"(位置编号为19968,十六进制是4E00),最后一个汉字是 ”吁“繁体字”吁“(位置编号40869,十进制表示为:9FA5)。
  • Unicode和GBK最大的区别在于,前127个字符,一个用8位表示,一个用16位表示。
  • Unicode制定时没有考虑与任何一种编码兼容。是全新的一套字符集。

UTF系列编码

正是由于Unicode字符集较于ASK码字符集,在很多字符标识的时候存在很大的空间浪费,我能用8位表示,你偏偏要用16位表示。很多时候数据需要在互联网上进行传输的,这样的化就会带来很大的网络带宽的浪费,为了减少浪费,提高网络利用率,出现了一些中间格式的字符集,被称为统一的转换格式(Unicode Transformation format),即UTF编码。UTF是Unicode字符集的编码方式

UTF-16编码

UTF-16比较好理解就是任何字符都用两个字节来保存。此时常常将Unicode和UTF-16等同对待。
UTF-16编码效率最高,字符到字节相互转换更简单,进行字符串操作也更好,适合本地内存和磁盘之间使用,可以进行字符和字节的快速转换。但是不适合做网络传输使用。

UTF-8编码

文件在网络中传输是以bit流的形式展开的,如果采用UTF-16编码的数据,接收的时候每16位一切就是一个字符;UTF-8编码是可变字节编码,文本数据读取是一个字节一个字节来读取的,然后根据字节开头的bit标识来识别,然后确定几个字节是一个字符单元。

UTF-8可变字节编码

UTF-8字符集中,原Unicode字符编号从0到127,前128个字符是单字节编码,编号在128至2047的是双字节编码(2的11次方),编号在2048之后就是三字节编码

切分字符以后怎样识别可变,三种情况分别为:

  • 一个字节代表一个字符:第一个字节前1个bit位为0,说明一个字节代表一个字符。
  • 两个字节代表一个字符:第一个字节的前3个bit位是110,第二个字节前2个bit位是10,说明两个字节代表一个字符。
  • 三个字节代表一个字符:第一个字节的前四位是1110,第二个字节的前2位是10,第三个字节的前2位是10,说明三个字节代表一个字符。
    在这里插入图片描述

UTF-8文件中,ASKⅡ码占用一个字节,中文占三个字节长度,相比较UTF-16,更适合网络传输,节省传输流量大小。

###UTF-8文件的解码过程
有个一个UTF-8编码的文件,文件内容如下:
“aá一”
分别是英文字母"a", 法语字母"à", 汉字"一"

第1步获取16进制编码
61 C3 A9 E4 B8 80

第2步转换为二进制编码:
01100001
11000011
10100001
11100100
10111000
10000000
此时能看出该文本共有六个字节。到底哪个字节是一个字符单元呢?

第3步根据UTF-8编码规则将字节分组:
01100001

11000011
10100001

11100100
10111000
10000000

第4步重新计算,得出对应的Unicode字符集的二进制编码:
00000000 01100001
00000000 11100001
01001110 00000000

计算规则是,去除二进制位的标红标志位,然后合并到一起,合并成一个16位二进制数。如果不足16位,高位用0补齐

第5步计算机从Unicode字符集中,利用二进制对应的编号反查出字符为:
a
á

二进制编号转成十进制字符编号为:
97
225
19968

在html中文件利用html实体可以查出来字符
aá&19968;
输出:aá一

在UTF8中空格是占三个字节,十进制编号为65279
在UTF16中空格是占两个字节,十进制编号为65534

结语

虽然一个汉字在UTF-8编码中占三个字节编码,但是计算机Unicode字符集中字符编号是一个双字节编码,这是计算机在反查之前,将UTF-8三个字节,每8位去除了标识位,然后拼接重组形成Unicode 16位二进制字符编号。有了这个双字节字符编号就可以去Unicode字符集反查相应的字符了。字符编号由UTF-8编码,转成了Unicode编码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章