首页 > 代码库 > 字符集的相关知识

字符集的相关知识

ASCII: 早期的字符集,7位,128个字符,包括大小写a-z字母,0-9数字以及一些控制字符.

  扩展ASCII: 1个字节8位,只用7位不合理.于是第8位用于扩展ASCII字符集,这样就又多了128个字符.于是用着后128个字符来扩展表示如拉丁字母,希腊字母等特殊符号.但问题是欧洲那一票国家很多互相都拥有不相同的特殊字母,一起塞进后128个明显不够,于是代码页出现了.

  Code Page(代码页): 1个字节前128个字符大家统一和ASCII一样,而后128个字符,根据不同系统所谓代码页来区分各个语言不相同的字母和符号.

  DBCS(双字节字符集): 对于亚洲国家,后128个字符依然无法包含大量的象形文字,DBCS正是为此的一个解决方案.DBCS由一个或两个字节表示一个字符,这说明DBCS并不一定是两个字节,对于如英文字母,是向ASCII兼容的,依然由1个字节表示,而对于如中文则用2个字节表示.英文和中文可以统一地处理,而区分是否为中文编码的方法是2个字节中的高字节的首位为1,就必须检查后面跟随的那个字节,2个字节一起解释为1个字符.GB2312,GBK到GB18030都属于DBCS.另外,简体中文Windows下的ANSI编码通常是指GBK(代码页936).

DBCS很大问题在于字符串的字符数不能通过字节数来决定,如"中文abc",字符数是5,而字节数是7.对于用++或--运算符来遍历字符串的程序员来说,这简直就是梦魇!

  Unicode: 学名为"Universal Multiple-Octet Coded Character Set",简称"UCS".UCS可以看作是"Unicode Character Set"的缩写.

也是一种字符集/字符编码方法,它统一用唯一的字符集来包含这个星球上多数语言的书写系统.UCS向ASCII兼容(即前128个字符是一致的),但并不兼容DBCS,因为其他字符在UCS中被重新编码(重新安排位置).

UCS有两种格式:UCS-2和UCS-4.前者用2个字节(16位)编码,后者用4个字节(实际上只用31位)编码.USC-4前2个字节都为0的部分称为BMP(基本多语言平面),就是说BMP去掉前2个零字节就是UCS-2.目前的UCS-4规范中还没有任何字符被分配在BMP之外.(说白了,USC-4就是为当16位的USC-2都被分配完时候做再做扩展用的,现在还没用到)

  UTF-8,UTF-16,UTF-32: "Unicode transformation format"(UTF) ,即Unicode的传输格式.Unicode规定了怎么编码字符,而UTF规定怎么将一个Unicode字符单元映射到字节序来传输或保存.

UTF-16UTF-32分别表示以16位和32位为一个Unicode单元进行编码,其实UTF-16对应就是UCS-2,UTF-32对应就是UCS-4(UCS-2和UCS-4是陈旧的说法,应抛弃)[看这里]. 另外,通常说的Unicode就是指UTF-16.

UTF-8是关键!如果统一Unicode都用2字节表示,英文字母觉得自己就很吃亏(高字节始终是0字节).UTF-8提供了一种灵活的解决办法:以单字节(8bit)作为编码单元,变长多字节编码方式.如ASCII字母继续使用1字节储存,中文汉字用3字节储存,其他最多可直6字节. 

UTF-16和UTF-32需要有字节序标志BOM(FEFF)解决大端小端问题.UTF-8没有字节序的问题(因为以1个字节为单元).

字符集的相关知识