BIG5编码, GB编码(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char 说明与区别



一. BIG5编码, GB编码(GB2312, GBK, ...), Unicode编码


1.1. BIG5编码


BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个


1.2. GB编码


GB2312字集是简体字集, 全称为GB2312(80)字集, 共包括国标简体汉字6763个;
GB2312是中国规定的汉字编码, 也可以说是简体中文的字符集编码;

GBK包含全部中文字符;
GBK字集是简繁字集, 包括了GB字集, BIG5字集和一些符号, 共包括21003个字符;
GBK是GB2312的扩展, 除了兼容GB2312外, 它还能显示繁体中文, 还有日文的假名;
GBK标准, 他兼容GB2312标准, 同时在GB2312标准的基础上扩展了GB13000包含的字;

注意:
1. GBK字集是简繁字集, 包括了GB字集, BIG5字集和一些符号; 例如BIG5编码能够表示XX汉字, GBK编码也能够表示XX汉字, 但是XX汉字的BIG5编码与GBK编码是不同的.
2. GBK编码兼容GB2312编码, 例如GB2312编码能够表示YY汉字, 那么GBK编码也能够表示YY汉字, 而且YY汉字的GB2312编码与GBK编码是相同的.
3. 也就是说"包含"与"兼容"是两回事来的.


1.3. Unicode编码


Unicode也是一种字符编码方法, 由国际组织设计, 可以容纳全世界所有语言文字的编码方案. Unicode的学名是"UniversalMultiple-Octet Coded Character Set". 简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写


1.4. 说明


1. ASCII, GB2312, GBK到GB18030的编码方法是向下兼容的. 而Unicode只与ASCII兼容, 与GB码不兼容.
例如"汉"字的Unicode编码是6C49, 而GB码是BABA.

2. 一般来说, 如果在简体中文操作系统中使用的繁体字, 选GBK码繁体中文; 如果在繁体中文操作系统使用繁体字, 选Big5码繁体中文;


1.5. 个人理解


BIG5编码, GB编码, Unicode编码相当于一个并列关系, 就是说使用不同的编码方式表达相同的内容.
例如"汉"字的Unicode编码是6C49, 而GB码是BABA.


二. Unicode编码与UTF编码

 

Unicode编码只是规定如何编码, 例如"汉"字的Unicode编码是6C49, 那么如何把"汉"字保存到文件中, 你可以直接把6C49的数值保存, 你也可以吧6C49这4个字符来保存, 也就是说需要一种保存格式(一种格式协议). UTF-8, UTF-7, UTF-16就是被广泛接受的保存格式.


2.1 举例UTF-8编码


UTF-8编码分段范围:
    编码范围        编码格式 
A. 0000 - 007F  0XXXXXXX
B. 0080 - 07FF  110XXXXX 10XXXXXX
C. 0800 - FFFF  1110XXXX 10XXXXXX 10XXXXXX

 例如“汉”字的Unicode编码是6C49, 6C49在编码范围范围C之内, 所以使用编码格式C(1110xxxx 10xxxxxx 10xxxxxx). 将6C49写成二进制是:0110 110001 001001, 依次代替模板中的X,得到:11100110 10110001 10001001, 即E6 B1 89. 所以"汉"字的Unicode编码是6C49, UTF-8的编码是E6B189.
 现在把"汉"字的UTF-8的编码保存在文本中, 程序知道这是UTF-8编码, 提取E6B189中的信息得到6C49, 因为6C49必然是Unicode编码, 所以知道这个是"汉"字.(因为这是一个格式协议, 程序就是按照这个格式协议来解析这个文件的).


2.2 UTF的一些说明


UTF是“Unicode Transformation Format”的缩写(UTF-8与ISO-8859-1完全兼容);
UTF-8则包含全世界所有国家需要用到的字符(因为Unicode);
UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示, 比如, 如果是UTF8编码, 则无需下载IE的中文语言支持包(相当于编码格式), 也可以在外国人的英文IE上也能显示中文(文字的显示只需要字体文件即可);
UTF-8的中文所占用的字节比使用GBK所占用的字节(UTF-8占用3字节, GBK占用2字节), 在html中, W3提倡用charset = "gbk", 而不是用charset = "gb2312";


2.3. 个人理解


1. UTF编码是针对Unicode编码的(例如2.1所说的例子), 所以如果GB编码与UTF编码互转, 需要通过Unicode编码做中间人.
2. Unicode编码, GB编码等就是对文字的编码规则, UTF编码是对Unicode编码的存储(传输)规则(不是对文字的编码规则).
3. 例如:
 UFT8编码E6B189是对Unicode编码的, 那么对应的Unicode编码是6C49, 这个Unicode编码6C49代表中文的"汉"字;
 假设UFT8编码E6B189是对GBK编码的, 那么对应的GBK编码也是6C49, 但是这个GBK编码6C49肯定不是代表中文的"汉"字, 而是其他文字;


 
三. WideChar, MultiByte, Char


WideChar: 宽字符, 两个字节为一个字符, 比如Unicode码, 这是全球统一编码的, 每个字符占2个字节
MultiByte: 多字节码, 一个字节或两个字节为一个字符(DBCS就这样)
Char: ANSI的单字符
MultiByte 以及 Char 这两个应该是兼容的, 可以认为MultiByte是对ANSI的一种扩充, 有时它是一个字符占一个字节, 有时是占两个字节.


各编码之间的互换请看: http://blog.csdn.net/bagboy_taobao_com/article/details/8594466




你可能感兴趣的:(C/C++)