GB2312 字符集.docx
《GB2312 字符集.docx》由会员分享,可在线阅读,更多相关《GB2312 字符集.docx(31页珍藏版)》请在冰豆网上搜索。
GB2312字符集
序言
这本手册用表格列出了GB2312汉字国家标准字符集的全部字符和编码,以及每个字符所对应的Unicode编码。
同时也列出了从Unicode到GB2312转换表。
这些表格的程式制作也收录在这本手册中。
修改记录:
∙第3.05版,二○○四年,局部修改。
∙第3.00版,二○○三年,整理成打印版。
∙第2.00版,一九九九年,整理成网页。
∙第1.00版,一九九七年,初稿完成。
阅读记录:
∙到2006年为止,本书已被阅读72,409次。
∙到2004年为止,本书已被阅读4,721次。
版权声明:
∙版权所有1997-2007杨和荣。
∙允许转载和使用,但必须保留版权声明
GB2312字符集和编码说明
GB2312字符集
GB2312是汉字字符集和编码的代号,中文全称为“信息交换用汉字编码字符集”,由中华人民共和国国家标准总局发布,一九八一年五月一日实施。
GB是“国标”二字的汉语拼音缩写。
GB2312字符集(characterset)只收录简化字汉字,以及一般常用字母和符号,主要通行于中国大陆地区和新加坡等地。
GB2312共收录有7445个字符,其中简化汉字6763个,字母和符号682个。
GB2312将所收录的字符分为94个区,编号为01区至94区;每个区收录94个字符,编号为01位至94位。
GB2312的每一个字符都由与其唯一对应的区号和位号所确定。
例如:
汉字“啊”,编号为16区01位。
GB2312字符集的区位分布表:
区号字数字符类别
0194一般符号
0272顺序号码
0394拉丁字母
0483日文假名
0586Katakana
0648希腊字母
0766俄文字母
0863汉语拼音符号
0976图形符号
10-15备用区
16-553755一级汉字,以拼音为序
56-873008二级汉字,以笔划为序
88-94备用区
这本手册列出了GB2312的全部字符和它们的区位号。
GB2312编码
GB2312原始编码(encoding)是对所收录的每个字符都用两个字节(byte)表示。
第一字节为“高字节”,由字符的区号值加上32而形成;第二字节为“低字节”,由字符的位号值加上32而形成。
例如:
汉字“啊”,编号为16区01位。
它的高字节为16+32=48(0x30),低字节为01+32=33(0x21),合并而成的编码为0x3021。
在区位号值上加32的原因大慨是为了避开低值字节区间。
由于GB2312原始编码与ASCII编码的字节有重叠,现在通行的GB2312编码是在原始编码的两个字节上各加128修改而形成。
例如:
汉字“啊”,编号为16区01位。
它的原始编码为0x3021,通行编码为0xB0A1。
如果不另加说明,GB2312常指这种修改过的编码。
这本手册列出了GB2312的全部字符和它们的编码。
GB2312与Unicode的关系
GB2312字符集是Unicode字符集的一个子集。
这也就是说,GB2312所收录的每一个字符都收录在Unicode之中。
但是GB2312编码和Unicode编码确没有什么相同之处。
同一个汉字,它的GB2312编码和Unicode编码确毫不相同。
例如:
汉字“啊”,它的GB2312编码为0xB0A1,但是它的Unicode编码为0x554A。
这本手册为GB2312的每一个字符列出了它所对应的Unicode编码和UTF-8(UnicodeTransformationFormat-8-bit)编码。
从GB2312到Unicode转换表制作程式
这本手册里的字符与汉字编码列表由下面的程式所生成。
/**
*GB2312Unicde.java
*Copyright(c)1997-2003byDr.HerongYang
*/
importjava.io.*;
importjava.nio.*;
importjava.nio.charset.*;
classGB2312Unicde{
staticOutputStreamout=null;
staticcharhexDigit[]={'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
staticintb_out[]={201,267,279,293,484,587,625,657,734,782,827,
874,901,980,5590};
staticinte_out[]={216,268,280,294,494,594,632,694,748,794,836,
894,903,994,5594};
publicstaticvoidmain(String[]args){
try{
out=newFileOutputStream("gb2312.gb");
writeCode();
out.close();
}catch(IOExceptione){
System.out.println(e.toString());
}
}
publicstaticvoidwriteCode()throwsIOException{
booleanreserved=false;
Stringname=null;
//GB2312isnotsupportedbyJDK.SoIamusingGBK.
CharsetDecodergbdc=Charset.forName("GBK").newDecoder();
CharsetEncoderuxec=Charset.forName("UTF-16BE").newEncoder();
CharsetEncoderu8ec=Charset.forName("UTF-8").newEncoder();
ByteBuffergbbb=null;
ByteBufferuxbb=null;
ByteBufferu8bb=null;
CharBuffercb=null;
intcount=0;
for(inti=1;i<=94;i++){
//Definingrowsettings
if(i>=1&&i<=9){
reserved=false;
name="Graphicsymbols";
}elseif(i>=10&&i<=15){
reserved=true;
name="Reserved";
}elseif(i>=16&&i<=55){
reserved=false;
name="Level1characters";
}elseif(i>=56&&i<=87){
reserved=false;
name="Level2characters";
}elseif(i>=88&&i<=94){
reserved=true;
name="Reserved";
}
//writingrowtitle
writeln();
writeString("
");
writeNumber(i);
writeString("Row:
"+name);
writeln();
writeString("
");
writeln();
if(!
reserved){
writeln();
writeHeader();
//loopingthroughallcharactersinonerow
for(intj=1;j<=94;j++){
bytehi=(byte)(0xA0+i);
bytelo=(byte)(0xA0+j);
if(validGB(i,j)){
//gettingGB,UTF-16BE,UTF-8codes
gbbb=ByteBuffer.wrap(newbyte[]{hi,lo});
try{
cb=gbdc.decode(gbbb);
uxbb=uxec.encode(cb);
cb.rewind();
u8bb=u8ec.encode(cb);
}catch(CharacterCodingExceptione){
cb=null;
uxbb=null;
u8bb=null;
}
}else{
cb=null;
uxbb=null;
u8bb=null;
}
writeNumber(i);
writeNumber(j);
writeString("");
if(cb!
=null){
writeByte(hi);
writeByte(lo);
writeString("");
writeHex(hi);
writeHex(lo);
count++;
}else{
writeGBSpace();
writeString("null");
}
writeString("");
writeByteBuffer(uxbb,2);
writeString("");
writeByteBuffer(u8bb,3);
if(j%2==0){
writeln();
}else{
writeString("");
}
}
writeFooter();
}
}
System.out.println("NumberofGBcharactersworte:
"+count);
}
publicstaticvoidwriteln()throwsIOException{
out.write(0x0D);
out.write(0x0A);
}
publicstaticvoidwriteByte(byteb)throwsIOException{
out.write(b&0xFF);
}
publicstaticvoidwriteByteBuffer(ByteBufferb,intl)
throwsIOException{
inti=0;
if(b==null){
writeString("null");
i=2;
}else{
for(i=0;i}
for(intj=i;j}