字符集相关知识的简单总结
咱花一个下午给自己归纳了下字符编码知识= =,在脑子里理理顺当~
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-16和UTF-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个字节为单元).
===============================================================================
其他注意点:
DBCS准确说,应该是MBCS(Multi-Byte Chactacter System, 多字节字符系统).
字符集(Charset)和编码(Encoding)注意区别.如GBK,GB2312以及Unicode都既是字符集,也是编码方式,而UTF-8只是编码方式,并不是字符集.
Linux下The GUN C Library(从glibc 2.2开始)中宽字符wchar_t是以32位的Unicode(USC-4)表示.如宽字符"中"字为 "0x00004e2d".而Windows下的CRT使用宽字符仍是16位的.
参考:
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
关于unicode,mbcs,utf8,charset,encoding等相关概念的说明
posted on 2012-09-15 23:54 Mr.DejaVu 阅读(1568) 评论(0) 编辑 收藏 举报