字符集GB2312的理解
在计算机程序中,通常都有涉及到GBK,GB2312编码方式的问题。常见的是网页打开是乱码啊,API之间传输的是乱码字符啊等等。
我们都知道,在计算机程序中,所有的信息都是以01来表示的,之所以编码是人类需要和计算机沟通。例如,人类要将一个汉字如“啊”保存在计算机中,如果采用GB2312编码保存的话,“啊”的B0A1.
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
在GB2312中,对所收对象进行了“分区”处理,每区含有94个对象。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
也可以将GB2312编码表理解成一个表格,它就有94行94列,一共8836个格子。
01-09行,收录的是特殊符号
16-55行为一级汉字,按拼音排序。
56-87行为二级汉字,按部首/笔画排序。
10-15行及88-94行则未有编码。
其中,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
使用GB2312作为字符集的计算机程序通常采用EUC储存方法,以便兼容于ASCII。
这些汉字及符号均以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
因为一级汉字从16区起始,所以汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是72*94=6768。
但是,这6768个区位码中,有5个是空位,分别是D7FA、D7FB、D7FC、D7FD、D7FE。
再以“啊”字举例,在大多数计算机程序中,它都会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1,就是1601)。
SQL> SELECT CHR(F_HEX2DEC('B0A1')) FROM DUAL;
CHR(F_HEX2DEC('B0A1'))
----------------------
啊
根据这些规则,我们将这些字符统统打印出来看一下。
declare
v_offset number;
begin
v_offset := f_hex2dec('a0');
for qu in 16 .. 55 loop
for wei in 1 .. 94 loop
if (qu = 16) then
dbms_output.put_line(qu || ':' || wei || '=' ||
chr(f_hex2dec(f_dec2hex(qu + v_offset) ||
f_dec2hex(wei + v_offset))));
end if;
end loop;
end loop;
end;
declare
v_offset number;
begin www.zzzyk.com
v_offset := f_hex2dec('a0');
for qu in 56 .. 87 loop
for wei in 1 .. 94 loop
if (qu = 87) then
dbms_output.put_line(qu || ':' || wei || '=' ||
chr(f_hex2dec(f_dec2hex(qu + v_offset) ||
f_dec2hex(wei + v_offset))));
end if;
end loop;
end loop;
end;
通过对字符集的理解,可以利用这些特点来开发出更加高效的计算机程序,也有助于理解一下转码操作。如应用程序保存时,有时候会出现汉字变乱码的现象。反正我是有些理解了,所以才总结下来。
补充:综合编程 , 其他综合 ,