字符编码简单介绍

字符:

  字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符集:

  字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。

字符编码:

  计算机中存储的信息包括数据信息和控制信息,这些信息以二进制数字的格式存储在计算机存储器中,对某种信息采用某一串二进制数字进行表示即为编码,字符或者图形采用二进制数字形式进行存储和表示即为字符编码。而解码则是编码的逆过程,是将二进制串转变为字符或者图形或者其他表示形式的过程。

例如ASCII码:

  ASCII码分为基础ASCII码和扩展ASCII码,

  基础ASCII码使用7位二进制数字来表示所有的大小写字母、数字0~9、标点符号以及美式英语中使用的特殊控制字符。

  0~3112733个是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为891013分别为退格、制表、换行、回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

  32~12695个字符,32sp是空格,其中38~5709是个阿拉伯数字。

  65~9026个大写英文字母,97~12226个小写英文字母,其余为标点符号和运算符号。

在标准ASCII中,最高位用作奇偶校验位。奇校验:1的个数为奇数,若非奇数,则最高位b71;同理偶校验指正确的代码一个字节中1的个数为偶数,若非偶数,则在最高位b71

  后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表示阿拉伯字母AinU+0041表示英语的大写字母AU+4E25表示汉字""。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。UTF-8UTF-16UTF-32Unicode的实现方式。

这里介绍一下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

 

posted @ 2013-07-31 20:54  瘦瘦男  阅读(383)  评论(0)    收藏  举报