- ANSII 这个是最基础的,只占用1个字节,反正键盘上能看到的显示的字符都能表示出来,范围是0x00~0x7F,保存英文字符够用了!后来,估计是觉得不够用,把128~255也扩展了出来。
- ANSI 是ANSII的扩展,因为ANSII只能表示所有的英文和英文标点符号,完全没有考虑广大非英文国家人的感受。所以就做了扩展(貌似是windows),每个国家的文字是不同的, 所以各个国家也就定义了自己的编码格式和规则。比如中国(简体中文),就使用GB2312编码格式,而台湾(繁体中文),就使用了Big5编码方式。中国汉字原来用GB2312原来也挺好的,但是中国博大精深,汉字太多,又做了扩展,变为了GBK,后来还是不够用,又扩大到了GB18030。各个国家之间是完全不互通的。也就是说同样是ANSI编码,一份文件中,有两种编码方式,GB2312,和Big5,自然有一部分乱码。
- Unicode ANSI出来以后,混乱了一篇,国际标准化组织就看不下去了,推出了全世界统一的编码规则,这个时候就出现了Unicode,但是Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。也就是说unicode规定了全世界所有的文字的编码,每个字(无论中文,英文,埃及文,爱斯基摩文)都有一个唯一的编号,但是英文原来用ANSII编码的时候只需要1个字节就够了,但是用Unicode,可能需要3~4个字节,这个让很多英文国家立马不爽了!有没有办法统一了,怎么办呢,UTF-8编码方式就出现了。
- UTF-8是Unicode编码的一种编码方式,它是一种变长的编码方式,当然也有其他格式的Unicode的编码方式(UTF-16,UTF-32...),但是这些都不常用,在互联网世界中最常用的就是这种编码方式了。UTF-8虽然是Unicode编码的的一种编码方式,但是对于n个字节的编码(n>1),两者编出来的码却是不相同的。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)--------------------+---------------------------------------------0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx下面是我在网上找到的一个例子:
下面,还是以汉字“严”为例,演示如何实现UTF-8编码。已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。