编码有两个大类:
非Unicode编码:ASCII、SO 8859-1、Windows-1252、GB2312、GBK、GB18030和Big5
Unicode编码:世界上所有的字符都统一分配了一个数字编号,大概有110多万
ASCII 只考虑了美国最初的需求,128个字符,用一个字节(8位)来表示,将最高位设置为0,剩下的7位正好可以表示128个ASCII,ASCII 规定了0~127的每个数字代表了的字符
ASCII码对于美国来说是够用了,但是对于其他国家不够用,于是各个国家的计算机厂商就发明了各种各样的编码方式来表示自己国家的字符,为了保持与ASCII码的兼容性,同时由于ASCII 将最高位置为0,其他的计算机厂商就将自己国家的编码的最高位设置为1。在这些扩展的编码中,在西欧国家流行的是ISO8859-1和Windows-1252,在中国是GB2312、GBK、GB18030和Big5
Windows-1252和ISO 8859-1基本是一样的,只有部分不一样,加入了欧元符号以及一些其他的常用的字符,可以认为ISO 8859-1已经被Windows-1252取代(都是一个字节来表示一个字符)
GB2312是中文的第一个标准,规定了简体中文常见字符,包括约7k个汉字和一些罕用词和繁体字,固定使用两个字节来表示一个汉字,最高位都是1,如果是0则认为是ASCII字符
GBK 向下兼容GB2312,GBK增加了14k多个汉字,所以总共有21k 汉字,包括繁体字,也同样是用固定的两个字节来表示一个汉字的
GB18030 向下兼容了GBK,增加了55k 多个汉字,所以总共有76k汉字,包括了很多少数民族字符以及中日韩统一字符,由于两个字节最多表示 2的16次方=65535 个字符,所以两个字节已经不能完全表示GB18030的所有字符,因此GB18030 使用变长编码,有的字符是两个字节,有的字符是4个字节
Big5 是针对繁体中文的,广泛用于我国台湾地区和我国香港特别行政区等地,Big5包括13k多个繁体字,和GB2312类似,以固定两个字节来表示一个字符
如果文本里的字符都是ASCII码字符,那么使用上面的任何一种编码都是一样的,因为ASCII是基础,所有的编码都兼容ASCII,如果最高位是1,除了GB2312、GBK、GB180相互兼容以外,其他编码都是不兼容的,即使Big5和GB18030都能表示繁体,表示方式也是不一样的
非Unicode 编码不仅规定了能表示哪些字符,也规定了每个字符对应的二进制是什么
【乱码】即指定的两种编码方式不兼容,编码转换时出现解析错误
非 Unicode 编码计算机厂商都只考虑了自己国家甚至自己厂商的字符和编码,导致出现了太多的编码且相互不兼容
Unicode 就出现了,Unicode 给世界上所有的字符都分配了一个唯一的数字编号,这个数字编号一般写成16进制,在前面加U+,但它并没有规定对应的二进制是什么
编号如何对应二进制表示呢?
主要就有UTF-32、UTF-16、UTF-8
UTF-32:用固定四个字节表示,比较浪费空间
UTF-16:用变长字节表示,常用字节用两个字节表示,增补字节用四个字节表示,也就是任何一个字符都是需要至少两个字节表示的,对于美国和西欧国家而言(他们的字符都可以用一个字符表示完)还是很浪费的
UTF-8:用变长字节表示,每个字节使用的字节书和其Unicode编号的大小有关,编号小的字符使用的字节就少,使用字节数有1~4个不等,UTF-8是兼容ASCII码,对于大部分中文而言,一个中文字符需要用三个字节来表示
小知识:
如何由Unicode编号来对应二进制?
1.首先将编号看作整数,并转化为相应的二进制
2.将二进制从右到左一次填入对应的二进制格式X中,填完后如果对应的二进制格式还有没填的空,就置为0
网友评论