说明
GB2312代码表用两个字节表示一个图形字符,两个字节中前面的字节为第一字节,后面的字节为第二字节。
区位码:
GB2312代码表分成94个区,范围为1-94,区的编号由第一字节表示;每个区有94位,范围为1-94,位的编号由第二字节表示。合起来就是图形字符的区位码。
机内码:
计算机内保存和传输用的是机内码,而不是区位码。
1)对于ASCII范围内的字符(即0x00~0x7F),值和ASCII的值相同。
2)对于ASCII范围以外的字符,先将区位码的区码和位码分别转换为十六进制表示,然后每个分别加上0xA0,就得到了机内码。
举例
汉字“啊”,在GB2312代码表的第16区的第01位,合起来区位码是16-01。将区码和位码分别转换为十六进制是0x1001,再将区码和位码分别加上0xA0,得到机内码为0xB0A1,这个就是“啊”这个字在计算机内用GB2312编码后的值。
代码验证:
import java.nio.ByteBuffer;
import java.nio.charset.Charset;public class Test3 {public static void main(String[] args) {// 对“啊”这个汉字用GB2312编码ByteBuffer b = Charset.forName("GB2312").encode("啊");byte[] ba = b.array();// 打印编码后每个字节的内容 for (int i = 0; i < ba.length; i++) {System.out.println(Integer.toHexString(Byte.toUnsignedInt(ba[i])).toUpperCase());}}
}
输出(十六进制),第一个字节是B0,第二个字节是A1,跟上面手算的一致: