【1】ASCII 每个字符占据1bytes(字节),第一次以规范标准发表是在1967年,最后一次修订是在1986年。用二进制表示的话最高位必须为0(扩展的ASCII不在考虑范围内),因此ASCII只能表示128个字
【2】GB2312 最早一版的中文编码(1980年),每个字占据2bytes。由于要和ASCII兼容,那这2bytes最高位不可以为0了(否则和ASCII会有冲突)。在GB2312中收录了6763个汉字以及682个特殊符号,已经囊括了生活中最常用的所有汉字。
【3】GBK 由于GB2312只有6763个汉字,汉语博大精深,怎么够?于是GBK中在保证不和GB2312、ASCII冲突(即兼容GB2312和ASCII)的前提下,也用每个字占据2bytes的方式又编码了许多汉字。经过GBK编码后,可以表示的汉字达到了20902个,另有984个汉语标点符号、部首等。值得注意的是这20902个汉字还包含了繁体字。
【4】GB18030 然而,GBK的两万多字也已经无法满足我们的需求了,还有更多可能你自己从来没见过的汉字需要编码。这时候显然只用2bytes表示一个字已经不够用了(2bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0就已经直接淘汰了一半的组合,只剩下3万多种组合无法满足全部汉字要求)。
因此GB18030多出来的汉字使用4bytes编码。当然,为了兼容GBK,这个四字节的前两位显然不能与GBK冲突(实操中发现后两位也并没有和GBK冲突)。我国在2000年和2005年分别颁布的两次GB18030编码,其中2005年的是在2000年基础上进一步补充。至此,GB18030编码的中文文件已经有七万多个汉字了,甚至包含了部分少数民族文字。由于全球200多个国家和地区,加上每个国家的差异,如果都占据一个表,那解码就太尴尬了。
【5】Unicode 万国码,统一码,1994年正式发布,以2bytes将各个国家的编码整合在一起,没有改变编码位置,所以Unicode是可以向下兼容GBK、GB2312的。但是由于原本ASCII码是用1bytes的,很多使用ASCII码的,如果采用这种方式编码,体积将变大一倍,造成资源浪费于是有了UTF-8。
【6】UTF-8,是Unicode码的压缩,重排。ASCII码部分仍旧使用1字节,汉字等使用3字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
微软默认的中文编码就是GBK,
1 print u"我爱拍森!" 2 #前面加个u,就可以将中文字符串,转换为Unicode,可以向下兼容GBK,因此不会乱码,主要是Python2下
原文地址:https://www.cnblogs.com/helloearthlings/p/10672383.html