字符编码小结


预备知识

==============================
存储器

位(bit),字节(byte),字(word), 双字(double word)

1 byte = 8 bits
1 word = 2 bytes = 16 bits
1 double word = 2 words = 4 bytes = 32 bits


ASCII编码

==============================
单字节

来自远古时代。
计算机最初是在美国等国家发明的,所以只需要把英文字母、数字、标点符号表示出来就好。
这些字符不多,也就200多个。

使用一个字节,从00000000到11111111共2^8=256个字符。
如:01000001(即十进制的65)表示字符"A"

Python的chr和ord函数,可以对ASCII编码进行了转换。
如:chr(65) == 'A', ord('A') == 65


ISO-8859-1编码

==============================
单字节

ISO-8859-1编码是单字节编码,向下兼容ASCII。
其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

此字符集主要支持欧洲使用的语言。


Unicode编码

==============================
双字节

两个字节,从00000000 00000000到11111111 11111111共表示256*256个字符

在Unicode中,原本ASCII中的127个字符只需在前面补一个全零的字节即可,
比如前文谈到的字符‘a’:01100001,在Unicode中变成了00000000 01100001。

优点:基本各种语言的字符,如东亚文字,阿拉伯文字,藏文字等等
缺点:对英文来说浪费严重,原本只需一个字节就能传输的英文现在变成两个字节,非常浪费存储空间和传输速度。


unicode在很长一段时间内无法推广,直到互联网的出现。


这是 Python3 中的默认编码!!!!!!

 


UTF-8编码

==============================
可变长字节

使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

比如​汉字的"中"字在Unicode中是01001110 00101101,而在UTF-8编码中是11100100 10111000 10101101。


GB2312编码

==============================
双字节编码

GB2312编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE。

GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。
GB2312编码共收录汉字6763个,其中一级汉字3755个,二级汉字3008个。
同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。


GBK编码

==============================
双字节编码

GB2312编码的扩展,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902。
总共收录了883个符号,21003个汉字及提供了1894个造字码位。

由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。


ANSI编码

==============================
混合编码

Windows简体中文操作系统中,ANSI是默认的编码方式。

对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版)


posted @ 2016-05-28 20:53  罗兵  阅读(312)  评论(0编辑  收藏  举报