首先介绍几种常见的字符集:
- ASCII 是基于常用英文的一套字符编码系统。每一个ASCII码与一个8位二进制数对应。
- GB2312和GBK GB2312是中国国家标准汉字信息交换用编码,简称国标码,采用两个字节表示一个字符,分别称为高位和低位,为了和ASCII码有所区别,中文字符每个字节最高位用1表示。GB2312字符集是几乎所有的中文系统和国际化软件都支持的中文字符集,也是最基本的中文字符集。GBK是在GB2312的基础上进行了一些扩展,对繁体中文,不常用汉字等进行了一些编码,但其不是国家标准,而只是规范。
- Unicode 使用了0~65525的双字节无符号数对每个字符进行编码,包括西欧,希腊,阿拉伯语,汉语,韩语,日语等进行了编码。
- UTF-8 对于0~127的ASCII字符,UTF-8用一个字节表示,如果字符对应Unicode码为0x0000,或在0x0080~0x007f,对应的UTF-8编码是两个字节,如果字符对应Unicode码在0x0800~0xffff,对应的UTF-8编码是三个字节。
在Java内部使用Unicode字符集表示字符,所以所有的字符都将被转换成Unicode字符在Java中执行。而由于不同应用方面对应的编码方式有很大不同,在各种编码之间互相转换的过程未必是可逆的,所以便产生了乱码的问题。
当从Unicode编码向某个字符集转换时,如果该字符集中没有对应的编码,则得到0x3f(即?)。从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd。