ascii编码和utf8编码,utf-8编码和ascii
编码原则ASCII,Unicode和UTF-8 - ITeye技术网站
编码说明:ASCII、Unicode和UTF-8作者:阮一峰
今天中午,我突然想弄清楚Unicode和UTF-8的关系,于是我开始在网上查资料
结果这个问题比我想象的要复杂,午饭后到晚上九点才知道
以下是我的笔记,主要用来整理思路不过我尽量说得通俗易懂,希望对其他朋友有用毕竟,字符编码是计算机技术的基石如果你想熟练地使用计算机,你必须知道一些字符编码的知识
1.ASCII码
我们知道,在计算机内部,所有的信息最终都是用二进制字符串表示的每一位有0和1两种状态,所以8位可以组合256种状态,称为一个字节换句话说,一个字节可以用来表示256个不同的状态,每个状态对应一个符号,也就是256个符号,从000000到1111111
20世纪60年代,美国制定了一套字符编码,对英文字符和二进制数字的关系做出了统一规定这就是所谓的ASCII码,一直沿用至今
ASCII码总共指定了128个字符比如空格“SPACE”是32(二进制0010000),大写字母A是65(二进制01000001)这128个符号(包括32个不能打印的控制符号)只占一个字节的后7位,前1位统一规定为0
2.非ASCII编码
用英语128个符号编码就够了,但表示其他语言就不够了比如在法语中,如果一个字母上面有音标,就不能用ASCII码表示因此,一些欧洲国家决定使用字节中空闲的最高位来编译新的符号例如,法语中é的代码是130(二进制10000010)这样,这些欧洲国家使用的编码系统可以表示多达256个符号
然而,这里又出现了新的问题不同的国家有不同的字母,所以即使都用256个符号,代表的字母也不一样例如,130在法语代码中代表é,但在希伯来语代码中它代表字母Gimel (?),在俄语代码中它代表另一个符号但是在所有这些编码方式中,0-127的符号都是一样的,唯一的区别就是128-255这一段
至于亚洲国家的文字,使用的符号比较多,大概有10万个汉字一个字节只能代表256种符号,肯定不够您必须使用多个字节来表示一个符号比如简体中文常用的编码方式是GB2312,用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号
中文编码的问题需要在专门的文章中讨论,本笔记不涉及这里只指出,虽然一个符号是用多个字节来表示的,但是GB类的汉字编码与下面的Unicode和UTF-8无关
3.统一码
前面提到过,世界上有很多种编码方式,同一个二进制数可以解释为不同的符号所以你要打开一个文本文件,一定要知道它的编码方式,否则用错误的编码方式解读,就会出现乱码为什么电子邮件经常出现乱码?因为发送方和接收方使用不同的编码方法
可以想象,如果有一个代码,世界上所有的符号都会包含在里面每个符号被赋予一个唯一的代码,那么乱码问题将会消失这就是Unicode,顾名思义,是所有符号的一种编码
Unicode当然是一个很大的集合,它目前的规模可以容纳超过一百万个符号每个符号的编码是不同的比如U 0639代表阿拉伯字母Ain,U 0041代表英文大写字母A,U 4E25代表汉字“颜”对于特定符号对应表,可以查询unicode.org或特殊汉字对应表
4.Unicode的问题
需要注意的是,Unicode只是一个符号集它只指定了一个符号的二进制代码,但没有指定这个二进制代码应该如何存储
比如汉字“颜”的unicode是十六进制数4E25,换算成二进制数有15位(1001100100100101),也就是说这个符号的表示至少需要2个字节表示其他更大的符号,可能需要3个字节或4个字节,甚至更多
这里有两个严重的问题第一个是,我们如何区分unicode和ascii?计算机怎么知道三个字节分别代表一个符号而不是三个符号?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了如果unicode统一规定每个符号用三个或四个字节表示,那么每个英文字母前的两三个字节必须是0,这是极大的存储浪费,文本文件的大小会大两三倍,这是不可接受的
结果如下:1)unicode的存储方式有很多种,也就是说可以用很多种不同的二进制格式来表示unicode2)unicode在很长一段时间内都无法普及,直到互联网的出现
5.UTF-8
随着互联网的普及,迫切需要一种统一的编码方法UTF-8是互联网上使用最广泛的unicode实现之一其他的实现还有UTF-16和UTF-32,但是在互联网上基本不用同样,这里的关系是UTF-8是Unicode的实现之一
UTF-8最大的特点之一是它是一种可变长度的编码方法它可以用1~4个字节来表示一个符号,字节长度根据符号的不同而不同
UTF-8的编码规则很简单,只有两条:
1)对于单字节符号,字节的第一位设置为0,后7位为该符号的unicode编码因此,对于英文字母,UTF-8编码和ASCII编码是相同的
2)对于n字节(n-1)的符号,第一个字节的前n位全部设置为1,第一个n位设置为0,后面字节的前两位全部设置为10其余未提及的二进制位都是该符号的unicode编码
下表总结了编码规则字母X表示可以编码的位数
Unicode符号范围 UTF-8编码方法
(十六进制)(二进制)
- -
0000 0000-0000 007F 0xxxxx
xx
0000 0080-0000 07FF 110