“深度学习“汉字国标码GB2312

       GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符.
GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖*99.75%
对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,需要使用GBK及GB18030汉字编码


一.规则

  1. 每个汉字有个二进制编码,叫汉字国标码. 
  2. GB2312-80 GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节.
  3. 区位码:十进制区码+十进制位码 
  4. 国际码(GB):(十六进制区码+20H)+(十六进制位码+20H)
  5. 机内码:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变
  6. 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表示汉字'我'

上一篇:ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE的区别解读


下一篇:OpenCV Error: Assertion Failed (size.width>0 && size.height>0)