汉字字库 区位码

百度知道。


国标


1980年颁布了《信息交换用汉字编码字符集—基本集》的国标交换码,国家标准号为:GB2312-80,选入了6763个汉字,分为两级,一级字库中有3755个,是常用汉字,二级字库中有3008个,是次常用汉字;还选入了682个字符,包含有数字、一般符号、拉丁字母、日本假名、希腊字母、俄文字母、拼音符号、注音字母等。以前我国大陆的各种中文DOS版本、Windows3.1 /3.2版本,装入的字库都是国标一二级字库。遇到“镕、?⒉t、?、祎、?住②S、?、?、驫、犇……”等汉字,既无法输入,又不能打印。

后来国家技术监督局又颁布了一个与之相对应的繁体字集,全称《信息交换用汉字编码字符集辅助集》,标准号为GB/T12345-90。


一级字库、二级字库


汉字的区位码标准是将汉字分为一级字库和二级字库:
一级字库中汉字是按拼音顺序编码,是通常用的汉字,二级字库是不经常用的汉字,是按汉字的部首笔划顺序编码的。

对于一级字库(16区到55区),每个汉字拼音的字母的出现是有规律的,比如字母a开头的字只出现在第16区中的‘啊’与‘澳’之间,如果要查某个汉字的首字母,只要其区码和位码在‘啊’与‘澳’之间,就可判断它的首字母是a,如果它的区码不在一级字库中就是二级字库的汉字。
对于二级字库(56区到87区),要自己建两个数组,一个存放二级字库中的汉字,另一个存放对应于上面数组中每个汉字的拼音首字母,每个数组都是存放3008个数据,因为二级字库有3008个字符,一级字库有3775个汉字。要查某个二级字库中的汉字的首字母,就从数组中找出相同的汉字,然后从另一个数组中查出其首字母。最好数组中的汉字字母按照其在二级字库中的顺序存放,这样要查某个二级汉字的首字母只要根据二级汉字的区码和位码就可计算出其首字母在字母数组中的位置,这样也就不用建存放二级字库汉字的数组了。

汉字的区位码表示将字符分成87个区,每区94个字符(序号从1到94,这个序号称为位码)汉字的区号从16区开始,每个区的位码从1到94。

汉字的内码用两个字节。每个字节都是从160十进制(A0十六进制,10100000二进制)开始,也就是两个高位位1表示是内码。高字节对应区位码中的区码,低字节对应区位码中的位码。
由于低字节从10100000开始,这样一个区就只能表示95个字,又由于区位码中的位码是从1开始的,这样内码低字节表示位码是从10100001(161)开始,就只能表示94个字,这正对应区位码中的每区94个汉字。

一个汉字内码与区位码的关系是:
十进制
内码高字节=区码+160   内码低字节=位码+160    
十六进制
内码高字节=区码+A0   内码低字节=位码+A0 
由于汉字的区码是从16开始的,16+160=176,这样汉字的内码的高字节就是从176开始的,得到一个规律:

※要判断一个字符是否是汉字的方法(对与Unicode字符,因为它是用两个字节表示一个字符,也是现在编程较常用的表示和存放字符的方法):
读出字符的高字节,将其转换位十进制,然后判断其是否大于等于(>=)176,如果是就表示它是汉字。
如果为了可靠,可以在判断完高字节后,再读出低字节,将其转换位十进制,然后判断其是否大于(>)160,如果是就表示它是汉字。



你可能感兴趣的:(汉字字库 区位码)