字符编码简单介绍
字符:
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集:
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
字符编码:
计算机中存储的信息包括数据信息和控制信息,这些信息以二进制数字的格式存储在计算机存储器中,对某种信息采用某一串二进制数字进行表示即为编码,字符或者图形采用二进制数字形式进行存储和表示即为字符编码。而解码则是编码的逆过程,是将二进制串转变为字符或者图形或者其他表示形式的过程。
例如ASCII码:
ASCII码分为基础ASCII码和扩展ASCII码,
基础ASCII码使用7位二进制数字来表示所有的大小写字母、数字0~9、标点符号以及美式英语中使用的特殊控制字符。
0~31及127共33个是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10、13分别为退格、制表、换行、回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126共95个字符,32sp是空格,其中38~57为0到9是个阿拉伯数字。
65~90为26个大写英文字母,97~122为26个小写英文字母,其余为标点符号和运算符号。
在标准ASCII中,最高位用作奇偶校验位。奇校验:1的个数为奇数,若非奇数,则最高位b7添1;同理偶校验指正确的代码一个字节中1的个数为偶数,若非偶数,则在最高位b7添1。
后128个称为扩展ASCII码,允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号。
非ASCII码:
在ascii码表中,只包括了一些字符、数字、标点符号的信息表示,这主要是因为计算机是美国发明的,在英文下面,我们使用ascii表示就足够了!但是在汉字输入下面,用ascii码就不能表示了,而汉字只是中国的通用表示,所以如果我们要在计算机中输入汉字,就必须有一个像ascii码的标准来表示每一个汉字,这就是中国的汉字国标码,它定义了汉字在计算机中的一个表示标准。通过这个标准,当我们输入汉字的时候,我们的输入码就转换为区位码,通过唯一的区位码得到这个汉字的字形码并显示出来。当然汉字的区位码在计算机中也是用二进制表示的!
简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号
为何会产生乱码
各个国家为了使计算机适合当地的语言和字符,设计了自己的编码方案,从数字、标点到文字、图形,进行了本地化设计。当本地计算机使用其他国家的程序或者在网络中互传信息,如果程序未做国际化处理,那么极有可能会显示乱码。
例如发送电子邮件,A发出的邮件采用CODE-A编码,而解码则采用CODE-A2解码,B的邮件采用CODE-B编码,而解码则采用CODE-B2解码。当A发出一封信,使用CODE-A编码,B收信采用CODE-B2解码,那必定会产生乱码。
为了解决乱码问题,一种Unicode编码方式应运而生。Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字"严"。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。UTF-8、UTF-16、UTF-32是Unicode的实现方式。
这里介绍一下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 | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx