一.首选得弄明白一些概念,如下:
字符(Character)
一个文字就是一个字符。在计算机中,字符是用数字来表示的,不同的文字用不同的数字表示。
字符集(Character Set)
既然是“集”,也就是“集合”,“字符集”自然就是“一定量字符的集合”。
一个字符集包含了固定数量的字符,如ASCII字符集包含A-Z、a-z、0-9、半角标点符号和特殊控制符号(如换行符)在内的128个字符。
字符编码(Encode)
编码,意思是指将数据通过一定方式表达或储存,这个方式就叫编码。所以字符编码就是字符的表现、储存方式,也就是字符集的实现方式。
代码页(code page)
是每一种编码方式的代号。这 是对照表:http://wenku.baidu.com/link?url=Aycytp_L-ogY1kPWq_Fc02sYrbpmPoIP-jPU6nfr73-Ap0nHYOEm2rShqS8Xiq3-k0NDgKpyoIijZY1yUwPG-ydXGJSYAan8X_rLP9Z5mBu
从上可以看出,字符集是字符的集合,字符编码是把字符集的实现方式。但需要注意的是:有的字符编码和字符集的名称是一致的。
二.然后来看一幅我总结的图:
首选是ASCII码然后发展为EASCII,它们没有字符集和编码格式的区别。
然后中国人发明了自己的汉字表示法--GB2312,之后又对它进行了扩充产生了GBK,它们的代码页都是cp936。再后来又产生了GB18030,对GBK再次进行了扩充,貌似还能表示日语和韩语,代码页是cp52936。这些的字符集和编码方式命名相同。
世界人发明通用字符表示法—Unicode/UCS,它又分为UCS-2和UCS-4,注意这只是字符集,是一张字符和序号对应的表而已。UTF-8/UTF-16/UTF-32才是各种编码实现,当然Unicode的编码方式还有其他实现。
Unicode和UCS区别:原来它们是由两个不同组织开发的,不过后来它们意识到了合并的必要性,于是现在基本没区别了。
UCS-2和UCS-4区别:前者用两个字节表示,后者用4个字节表示,因此后者比前者容量更大。UTF-8和UTF-16就是UCS-2的实现,UTF-32是UCS-4的实现。
混淆点:UTF-8不是UCS-2的实现吗,怎么有些字符编码占了3个字节?这里的8不是指每个字符用8位表示,而是传输是按8位传。至于为什么占3个字节,前面说过UCS-2是字符集,它用16位编码,但是没有限定具体实现方式用什么方式保存和传输,故UTF-8用1~3个字节保存或者传输。
以上只是个人理解,但实际上我也根据自己的理解解决了很多实际遇到的问题。