先从最简单的说起。。。ASCII码。。。大家都知道的了。。。用7位的编码如果只是代表英文字母和标点符号。。。还是可以的。。。。但是如果想要表达汉字或者其他字符。。。就远远不够了。。。因此就出现了很多其他的编码。。。如下。。。。。
(1) 为了处理汉字,于是出现了用于简体中文的GB2312和用于繁体中文的big5
GB2312采用变长编码。。。如果第一个字节的第一位是0.。。则代表这个字符只有一个字节。。。只有一个字节的字符其编码和ASCII码一样。。。如果第一个字节的第一位是1。。。则把下一个字节和当前字节一起。。当作一个字符的双字节编码。。。
后来再继续拓展。。。以支持更多的汉字。。。因此出现了GBK和GB18030。。。其中GB18030成为正式的国家标准。。。。从GB18030到GBK。。。到GB2312。。。再到ASCII。。都是向下兼容的。。。
而对于现在的PC平台。。必须支持GB18030。。。对于嵌入式产品则暂不要求。。。所以手机、MP3等一般都只支持GB2312。。。
(2) 而unicode是由国际组织设计的,可以容纳全世界多种语言文字的编码方案。。。。
正确的说。。。unicode是一张编码表。。。。上面规定了各个字符的编码(类似于各个字符的代号)。。
这张编码表如果用人眼来看。。。然后每个编码都是唯一的。。。要什么字符都可以在上面查找到。。。
但是在计算机传输和处理中确不行。。。。如果字符按unicode中的编码直接转成字节流来传输。。。计算机无法判断从那个字节字符的开始。。。毕竟计算机里面所有信息都是用1、0的字节流来传输的。。。
因此出现了用于传输的编码。。。utf-8和utf-16.。。。。
也就是说。。。utf-8和utf-16都是表示unicode的。。。只是unicode用于传输的不同格式而已。。。
utf-8是用8位为单元的变长编码。。。。如下:
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
第一个字节的开头。。。代表了需要把当前字节和后面多少个字节一起当作一个字符的字节流来解析。。。
而对于一般的英文子母等。。。则一般都是只有一个字节表示的。。。所以utf-8中英文字母的字节流和ASCII字节流几乎是一样的。。。。
utf-16则是以16位为单元的变长编码。。。对了。。。没错。。。utf-16也是变长编码。。。。
编码格式类似于utf-8.。。。。但是由于utf-16以16位为一个单元。。。因此对于0x10000的unicode码。。。刚好与其 utf-16格式的字节流一样。。。而实际应用中的unicode码总是小于0x10000。。。所以经常把utf-16字节流当作unicode编 码。。。。
最后再说一点。。。。
在windows 的API中。。。有两个函数是用来进行多字节和宽字节直接的转换的。。。
MultiByteToWideChar();
WideCharToMultiByte();
utf-8字节流,GB2312等就可以说是多字节。。。因为都是用8位为单元的。。。
而utf-16则可以说是宽字节。。。。因为是以16位为单元的。。。。
其他的详细信息可以参考MSDN和一些相关书籍。。。。