GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符.
GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖*99.75%
对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,需要使用GBK及GB18030汉字编码
一.规则
- 每个汉字有个二进制编码,叫汉字国标码.
- GB2312-80 GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节.
- 区位码:十进制区码+十进制位码
- 国际码(GB):(十六进制区码+20H)+(十六进制位码+20H)
- 机内码:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变
- 16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序
二.JAVA代码
public final static int DRI16 = 16;
public final static int DRI55 = 55;
public final static int DRI56 = 56;
public final static int DRI87 = 87;
public final static int MIN_POS = 1;
public final static int MAX_POS = 94;
public static void main(String[] args) throws UnsupportedEncodingException {
/** 定义字节数组,长度为2,分别用于存放高位字节和地位字节 */
int index = 1;
byte[] gbBytes = new byte[2];
for (int d = DRI16; d <= DRI55; d++) {
/** 第一个字节(高位字节)+20H即十进制32 */
int high_pos = d + 32;
/** 第一个字节(高位字节)+128 */
high_pos += 128;
/** 给第一个字节(高位字节)赋值 */
gbBytes[0] = (byte) high_pos;
for (int p = MIN_POS; p <= MAX_POS; p++) {
/** 第二个字节(低位字节)+20H即十进制32 */
int low_pos = p + 32;
/** 第二个字节(地位字节)+128 */
low_pos += 128;
/** 第二个字节(地位字节)赋值 */
gbBytes[1] = (byte) low_pos;
/** 构造汉字字符并输出,下面就是见证奇迹的时刻 */
String ccStr = new String(gbBytes, "GB2312");
if (!(d == DRI55 && p >= 90)) {
System.out.print("第" + (index++) + "个汉字是:");
System.out.println(ccStr);
}
}
}
for (int d = DRI56; d <= DRI87; d++) {
/** 第一个字节(高位字节)+20H即十进制32 */
int high_pos = d + 32;
/** 第一个字节(高位字节)+128 */
high_pos += 128;
/** 给第一个字节(高位字节)赋值 */
gbBytes[0] = (byte) high_pos;
for (int p = MIN_POS; p <= MAX_POS; p++) {
/** 第二个字节(低位字节)+20H即十进制32 */
int low_pos = p + 32;
/** 第二个字节(低位字节)+128 */
low_pos += 128;
/** 第二个字节(低位字节)赋值 */
gbBytes[1] = (byte) low_pos;
/** 构造汉字字符并输出,下面就是见证奇迹的时刻 */
String ccStr = new String(gbBytes, "GB2312");
System.out.print("第" + (index++) + "个汉字是:");
System.out.println(ccStr);
}
}
}
三.GB 2312是如何兼容ASCII码的
当遇到1开头的字,就把两个字节合起来解析为一个汉字;遇到0开头的字节,就把这个字节解析为一个ASCII码字符(0-12),
如:01000001表示'A'(A的ASCII码值为65)
如:11001110 11010010表示汉字'我'