咱花一个下午给自己归纳 了 下字符编码知识= =,在脑子里理理顺当~
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等相关概念的说明