微言耸听

导航

GB2312编码

GB2312编码

GB2312字符集简介:
GB2312是汉字字符集和编码的代号,中文全称为 “信息交换用汉字编码字符集” ,由中华人民共和国国家标准总局发布,一九八一年五月一日实施。GB是 “国标”  二字的汉语拼音缩写。
GB2312 字符集 (character set) 只收录简化字汉字,以及一般常用字母和符号,主要通行于中国大陆地区和新加坡等地。GB2312 共收录有 7445 个字符,其中简化汉字 6763 个,字母和符号 682 个。
GB2312 将所收录的字符分为 94 个区,编号为 01 区至 94 区;每个区收录 94 个字符,编号为 01 位至 94 位。GB2312 的每一个字符都由与其唯一对应的区号和位号所确定。例如:汉字“啊”,编号为 16 区 01 位。
GB2312编码的范围为:高字节范围是0XA1-0XFF,低字节范围是0XA1-0XFF。
链接:  GB2312简体中文编码表 

区位码:
区位码简单来说就是一个汉字或者符号对应一个字符表(信息交换用汉字编码字符集,GB2312标准)中的位置。区位码是一个四位的十进制数,每个区位码都对应着一个唯一的汉字或符号,它的前两位叫做区码,后两位叫做位码。

GB2312字符集的区位分布表:
信息交换用汉字编码字符集》可以理解成是一个表格,对所收汉字进行了 “分区” 处理,每区含有94个汉字/符号。
 区号    字数    字符类别 
    01      94    一般符号 
    02      72    顺序号码 
    03      94    拉丁字母 
    04      83    日文假名 
    05      86    Katakana 
    06      48    希腊字母 
    07      66    俄文字母 
    08      63    汉语拼音符号 
    09      76    图形符号 
 10-15            备用区 
 16-55    3755    一级汉字,以拼音为序 
 56-87    3008    二级汉字,以笔划为序 
 88-94            备用区 


GB2312编码:
GB2312 原始编码 (encoding) 是对所收录的每个字符都用两个字节 (byte) 表示。第一字节为 “高字节”,由字符的区号值加上32 而形成;第二字节为 “低字节”,由字符的位号值加上 32 而形成。在区位号值上加 32 的原因大慨是为了避开低值字节区间。
由于 GB2312 原始编码与ASCII 编码的字节有重叠,现在通行的 GB2312 编码是在原始编码的两个字节上各加128 修改而形成,如果不另加说明,GB2312 常指这种修改过的编码。
例如:汉字 “啊” ,编号为 16 区 01 位。
原始编码:高位字节为16+32=48,16进制为0X30;低位字节为1+32=33,16进制为0X21。所以它的原始编码为 0x3021。
通行编码:高位字节为16+32+128=176,16进制为0XB0;低位字节为1+32+128=161,16进制为0XA1。所以它的通行编码为 0xB0A1。

 1 package com.nice.util;
 2 
 3 public class GB2312ValueUtil {
 4 
 5  // 头标识
 6  private static final String HEAD = "code  +0   +1   +2   +3   +4   +5   +6   " +
 7    "+7   +8   +9   +A   +B   +C   +D   +E   +F";
 8 
 9  // 分隔符
10  private static final String SEPARATOR = "---------------------------------------" +
11    "-----------------------------------------------";
12 
13  /**
14   * 打印GB2312简体中文编码值
15   */
16  public static void printGB2312CodingValue() {
17   // 遍历所有区码
18   for (int region = 0XA1; region < 0XFF; region++) {
19    // 区码-128-32
20    int i = region - 128 - 32;
21    println(SEPARATOR);
22    println("第 " + i + " 区:");
23    println(SEPARATOR);
24    println(HEAD);
25    // 遍历所有位码
26    for (int bitCode = 0XA0; bitCode <= 0XFF; bitCode++) {
27     // 位码-128-32
28     int j = bitCode - 128 - 32;
29     if (j == 0) {
30      print(Integer.toHexString(region) + ""
31        + Integer.toHexString(bitCode) + " ");
32     }
33     print(Integer.toHexString(region) + ""
34       + Integer.toHexString(bitCode) + " ");
35     // 小于95位
36     if ((j + 1) % 0X10 == 0 && (j + 1) < 0X5F) {
37      print("\n");
38      print(Integer.toHexString(region) + ""
39        + Integer.toHexString(bitCode + 1) + " ");
40     }
41    }
42    print("\n");
43   }
44   println(SEPARATOR);
45  }
46 
47  /**
48   * @param context
49   */
50  private static void println(Object context) {
51   if (context != null) {
52    System.out.println(context);
53   } else {
54    System.out.println();
55   }
56 
57  }
58 
59  /**
60   * @param context
61   */
62  private static void print(Object context) {
63   System.out.print(context);
64  }
65 
66  /**
67   * @param args
68   */
69  public static void main(String[] args) {
70   printGB2312CodingValue();
71  }
72 
73 }

转载: http://blog.163.com/lyq_163_2009/blog/static/13408269620116752322992/

posted on 2013-01-10 15:09  微言耸听  阅读(514)  评论(0)    收藏  举报