Chrisの梳羽之礁

A look of quick intelligence and soft refinement
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

字符集

Posted on 2010-10-27 16:31  Chrisfang6  阅读(1416)  评论(0编辑  收藏  举报

每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)

 

一、字符的表示由字符集charset和该字符集的编码决定。

  1、ASCII(又称ASCII 127)字符集只有一种编码

  2、ANSI字符集,正式名称MBCS(Multi-Byte Character System,多字节字符系统),包括GB-3212等各国自己的扩展自ASCII的字符集等。大多数也只有一种编码。

  3、Unicode字符集,有UTF-8,UTF-16和UTF-32三套编码。

 

二、字符集格式

  1、MBCS格式:以ASCII 127 bits为基础,兼容ASCII 127。其中每个字符的第一个字节为Leading byte。

Leading byte小于0x7F(127)

说明该字符为ASCII字符

Leading byte大于0x7F

与后面的第二甚至第三个字节一起作为一个字符的编码

 

 

 

 

 

  2、Unicode格式:通常所说的Unicode就是指Unicode16。一段字符的最前端的几个字节说明编码方式。

EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian
00 00 FE FF UTF-32/UCS-4, big endian

 

 

 

 

 

big endian(大尾)和little endian(小尾) 

endian即“字节序”。big endian和little endian是CPU处理多字节数的方式。如Unicode编码是AABB。写到文件里时,如果将AA写在前面,就是big endian;将BB写在前面,就是little endian。 
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。 
在Big-endian处理器(如苹果Macintosh电脑)上建立的Unicode文件中的文字位元组(存放单位)排列顺序,与在Intel处理器上建立的文件的文字位元组排列顺序相反。最重要的位元组拥有最低的地址,且会先储存文字中较大的一端。为使这类电脑的用户能够存取你的文件,可选择Unicode big-endian格式。

    1)UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。

      a) UFT-8转换表

00000000-0000007F 7FFFFFFF
00000080-000007FF 110xxxxx  10xxxxxx
00000800-0000FFFF 1110xxxx  10xxxxxx  10xxxxxx
00010000-001FFFFF 11110xxx  10xxxxxx  10xxxxxx  10xxxxxx
00200000-03FFFFFF 111110xx  10xxxxxx  10xxxxxx  10xxxxxx  10xxxxxx
04000000-7FFFFFFF 1111110x  10xxxxxx  10xxxxxx  10xxxxxx  10xxxxxx  10xxxxxx

 

 

 

 

 

 

      b) UTF-8编码字节含义

         对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;

         如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;

         如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;

         如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;

         如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;

      c) 对UTF-8编码中的任意字节,

         根据第一位,可判断是否为ASCII字符;

         根据前二位,可判断该字节是否为一个字符编码的第一个字节; 

         根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;

         根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。

 

  3、GB2312:高字节和低字节的第1位都是1

  4、BIG5,GBK&GB18030:高字节的第1位为1。操作系统有默认的编码,常为GBK,可以下载别的并升级。通过判断高字节的第1位从而知道是ASCII或者汉字编码。

 

三、更多详细知识

  1、常用字符集分类

ASCII及其扩展字符集

作用:表语英语及西欧语言。

位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。

范围:ASCII从00到7F,扩展从00到FF。

ISO-8859-1字符集

作用:扩展ASCII,表示西欧、希腊语等。

位数:8位,

范围:从00到FF,兼容ASCII字符集。

GB2312字符集

作用:国家简体中文字符集,兼容ASCII。

位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。

范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。

BIG5字符集

作用:统一繁体字编码。

位数:使用2个字节表示,表示13053个汉字。

范围:高字节从A1到F9,低字节从40到7E,A1到FE。

GBK字符集

作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。

位数:使用2个字节表示,可表示21886个字符。

范围:高字节从81到FE,低字节从40到FE。

GB18030字符集

作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。

位数:它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字。

范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。

UCS字符集

作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。

位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。

范围:目前,UCS-4只是在UCS-2前面加了0×0000。

UNICODE字符集

作用:为世界650种语言进行统一编码,兼容ISO-8859-1。

位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。

 

2 ,按所表示的文字分类

语言                                 字符集                                     正式名称

英语、西欧语                     ASCII,ISO-8859-1                MBCS 多字节

简体中文                             GB2312                                    MBCS 多字节

繁体中文                             BIG5                                         MBCS 多字节

简繁中文                             GBK                                         MBCS 多字节

中文、日文及朝鲜语         GB18030                                  MBCS 多字节

各国语言                             UNICODE,UCS                    DBCS 宽字节