基于奇偶校验的gbk字符查询系统及其实现方法

文档序号:6336551阅读:326来源:国知局
专利名称:基于奇偶校验的gbk字符查询系统及其实现方法
技术领域
本发明涉及一种汉字字符查询系统,尤其涉及一种基于奇偶校验的GBK字符查询系统;此外,本发明还涉及该基于奇偶校验的GBK字符查询系统的实现方法。
背景技术
一、GBK编码的汉字边界问题GBK编码是计算机中表示汉字字符的最常用方法之一。它的全称为《汉字内码扩展规范》(GBK),英文名称Chinese Internal Code Specification,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函19952 号文件的形式,将它确定为技术规范指导性文件,发布和实施。GBK编码在GB2312-80标准基础上的内码扩展规范, 使用了双字节编码方案,其编码范围从8140至FEFE (剔除xx7F),共23940个码位,共收录了 21003个汉字,完全兼容GB2312-80标准,支持国际标准IS0/IEC10646-1和国家标准 GB13000-1中的全部中日韩汉字,并包含了 BIG5编码中的所有汉字。GBK编码的高字节范围是0X81-0xFE,低字节范围是0x40-7E和0x80_0xFE。GBK汉字编码在确定汉字边界时可能会遇到问题,主要表现在1. GBK编码中,部分编码和ASC-II编码有重叠,导致ASC字符查找的误命中问题;2.双字节编码方式,没有标志位,难以确定单个汉字的起始字节和终止字节的位置,导致进行单个汉字的查询时,无法确定汉字边界。因此,需要一种GBK编码的自匹配系统,能查找并确定汉字的边界,从而成功解决上述查询误匹配问题。二、GBK汉字边界不明所导致的问题GBK编码系统内,中文汉字采用了双字节的编码方式,即每个汉字由2个字节来表示。例如“靳怀堵水文化文集”这句话,在计算机看来,是一段字符串,用16进制表示为“BD F9 BB B3 89 40 CB AE CE C4 BB AF CE C4 BC AF”。由于GBK编码缺乏标志位,计算机在判断该段字符串时,难以判断出汉字的边界。 由此导致的问题是,在进行字符查找时,由于汉字边界不确定,导致字符匹配错位问题。例如上述字符串中,汉字“堵”,GBK编码为[89,40]。而编码40也表示是ASC符号“@”。因此,当符号‘@,时,会发现在字符串“靳怀堵水文化文集”中出现了该符号,与实际情况不符。除了 ASC字符查找的问题,在汉字查找时也会出现问题。这是由于GBK汉字编码的边界不明确,也会导致汉字错位问题。例如汉字字符串“大学生健康教育”,对应的GBK编码为“B4 F3 Dl A7 C9FA BD Al BF B5 BD CC D3 FD”,在其中如果查找汉字“笱”时,会发现是存在的。由于“笱”的编码为 [F3,Dl],刚好是汉字“大”的低字节F3,和“学”字的高字节Dl组合而成,从而导致了该错误。

发明内容
本发明要解决的技术问题是提供一种基于奇偶校验的GBK字符查询系统,该系统能查找并确定汉字的边界,从而成功解决汉字高低字节编码交叉容易导致的查询误匹配问题。为此,本发明还提供该基于奇偶校验的GBK字符查询系统的实现方法。为解决上述技术问题,本发明提供一种基于奇偶校验的GBK字符查询系统,该系统包括三个模块字符基础查询模块、GBK奇偶校验模块和汉字边界验证模块;该字符基础查询模块用于对读取的GBK编码字符串与查询字符串进行基础查询, 在GBK编码字符串中找到满足查询字符串出现的位置,并记录其起始位置和终止位置;该GBK奇偶校验模块用于对该字符基础查询模块所得的基础查询结果进行编码校验,首先沿起始位置向前依次检测字节以判断步长计数器count的奇偶值,然后沿终止位置向后依次检测字节以判断步长计数器count的奇偶值;该汉字边界验证模块用于根据该GBK奇偶校验模块的奇偶值校验结果来判断起始位置和终止位置是否处在GBK双字节汉字的边界上。所述字符基础查询模块的查询方式为从左至右依次扫描GBK编码字符串,找到满足查询字符串出现的位置,并进行记录起始位置为headp0S_k,终止位置为tailp0S_k,其中数字k表示在当前GBK编码字符串中第k次基础查询匹配到的结果。所述GBK奇偶校验模块中沿起始位置向前依次检测字节以判断步长计数器count 的奇偶值具体采用如下方法首先,将步长计数器count初始设为0 ;然后,沿headp0S_k向前,依次检测字节T」,其中i = headposl-l,headposl-2···.,0 ;然后,计算T_i&0x80是否为0,并根据T_i&0x80运算的数值进行处理逻辑;最后判断步长计数器count的奇偶值,如果count为奇数,则记录head_valid = 0 ;如果count为偶数,则记录head_valid = 1。所述GBK奇偶校验模块中沿终止位置向后依次检测字节以判断步长计数器count 的奇偶值具体采用如下方法首先,将步长计数器count初始设为0 ;然后,沿tailp0S_k向后,依次检测字节T_i,其中i = tailpos+1, tailposl+2···.;然后,计算T_i&0x80是否为 0,并根据T_i&0x80运算的数值进行处理逻辑;最后判断步长计数器count的奇偶值,如果 count为奇数,则记录tail_valid = 0 ;如果count为偶数,则记录tail_valid = 1。所述汉字边界验证模块的验证方法具体为如果head_Valid = 1且tailjalid =1,则当前GBK字符的匹配结果有效,将该次查询所得的匹配信息headp0S_k,tailpos_ k进行记录;如果head_valid = 0或tail_valid = 0,则当前GBK字符的匹配结果无效,忽略本次匹配结果,并设置k = k+l,继续返回GBK奇偶校验模块,重新进行下一个查询位置的验证工作,直至k为字符基础查询模块的最后一个匹配结果才结束查询,输出查询结果。此外,本发明还提供一种基于奇偶校验的GBK字符查询系统的实现方法,包括如下步骤(1)读取GBK编码的字符串,导入到给定字符串中,以text_str标记;(2)读取查询字符串,标记为query_str ;(3)将query_str和text_str进行基础查询,方式为从左至右依次扫描text_ str,找到满足query_Str出现的位置,并进行记录起始位置为headp0S_k,终止位置为 tailp0S_k,其中数字k表示在当前串text_str中第k次基础查询匹配到的结果;
(4)在获取步骤(3)的基础查询结果headp0S_iaP tailp0S_k之后进行编码校验, 具体为步骤A 沿headp0S_k向前依次检测字节T_i以判断步长计数器count的奇偶值, 其中,i = headposl-l,headposl-2···.,0 ;步骤 B 沿 tailpos_k 向后依次检测字节 T_i 以判断步长计数器count的奇偶值,其中i = tailpos+1, tailposl+2-.;(5)根据步骤⑷的奇偶值校验结果来判断headposj和tailposj是否处在GBK 双字节汉字的边界上;(6)输出GBK字符查询结果。在步骤(4)中,所述步骤A具体为1)将步长计数器count初始设为0;2)沿 headpos_k 向前,依次检测字节 T_i,其中,i = headposl-1, headposl-2—.,0 ;3)计算 T_ i&0x80是否为0 ;4)根据T_i&0x80运算的数值进行如下处理逻辑如果T_i&0x80等于0, 则记录head_valid= 1,并终止本步骤后续流程,直接进入步骤B ;如果T_i&0x80不等于0, 则将计数器count = coimt+1,再根据T_i的数值,进行以下两个处理子逻辑如果i = 0, 则终止该步骤,并输出count数值;如果i > 0,则将T_i设为T_i-1,并重新执行上述步骤 A的运算,即继续沿本字符串向前检测力)判断步长计数器count的奇偶值,如果count为奇数,则记录head_valid = 0 ;如果count为偶数,则记录head_valid = 1。在步骤中,所述步骤B具体为1)将步长计数器count初始设为0;2)沿 tailpos_k 向后,依次检测字节 T_i,其中 i = tailpos+1,tailposl+2···· ;3)计算 T_i&0x80 是否为0 ;4)根据T_i&0x80运算的数值进行如下处理逻辑如果T_i&0x80等于0,则记录 tail_valid = 1,并终止本步骤后续流程;如果T_i&0x80不等于0,则将计数器count = coimt+1,再根据T_i的数值,进行以下两个处理子逻辑如果i和当前字符串teXt_Str的长度相同,则终止该步骤,并输出count数值;如果i <当前字符串teXt_Str的长度,则将 T_i设为T_i+1,并重新执行上述步骤B的运算,即沿本字符串继续向后检测力)判断步长计数器count的奇偶值,如果count为奇数,则记录tailjalid = 0 ;如果count为偶数, 则记录 tail_valid = 1。步骤(5)具体为如果head_valid = 1且tail_valid = 1时,则当前GBK字符的匹配结果有效,将该次查询所得的匹配信息headp0S_k,行记录;如果head_ valid = 0或tailjalid = 0时,则当前GBK字符的匹配结果无效,忽略本次匹配结果,并设置k = k+Ι,继续返回步骤,重新进行下一个查询位置的验证工作。步骤(6)具体为如果k已是步骤(3)的最后一个匹配结果,则结束本次查询的所有验证工作,将成功匹配的全部符查询结果进行输出;如果k不是步骤C3)最后一个匹配结果,则设置k = k+l,继续返回步骤G),重新进行下一个查询位置的验证工作。本发明的有益效果在于本发明针对GBK编码的字符串,在进行字符查询时,由于汉字高低字节编码交叉容易导致的误匹配问题,提出了一种自匹配的基于奇偶校验的GBK 字符查询系统,该系统由字符基础查询模块、GBK奇偶校验模块、汉字边界验证模块三部分组成,利用汉字双字节编码的特点,使用了向前向后双向奇偶校验的方法,对字符匹配结果进行逐一验证,该系统的实践证明能很好的处理GBK字符查询的问题,既能剔除高低字节误匹配的结果,又能保留合法匹配的结果。


图1是本发明系统的模块结构及流程示意图。
具体实施例方式如图1所示,本发明提出一种自匹配的基于奇偶校验的GBK字符查询系统,该系统包括三个模块字符基础查询模块、GBK奇偶校验模块、汉字边界验证模块。通过该三个模块相互衔接,可以良好的处理GBK编码中的字符串查找时所遇到的字符匹配错位问题。下面举一实施例来具体说明该基于奇偶校验的GBK字符查询系统的实现方法,其包括如下步骤(见图1)1.该系统首先读取GBK编码的字符串(即读取GBK匹配文本),导入到给定字符串中,这里以teXt_Str标记。并以字节(Byte)为单位,将该字符串的每一个字节依次命名 T_0, T_l, Τ_2, Τ_3, Τ_4......2.读取查询字符串,这里标记为qUery_Str,同样以字节(Byte)为单位进行标记, 命名为Q_0,Q_l,Q_2, Q_3, Q_4…..3.字符基础查询模块将query_str和text_str进行基础查询,方式为从左至右依次扫描text_str,找到满足query_str出现的位置,并进行记录起始位置为headp0S_k,终止位置为tailp0S_ k(其中数字k表示在当前串teXt_Str中第k次基础查询匹配到的结果,即第一次为 headpos_l 禾口 tailpos_l,第二次为 headpos_2 禾口 tailpos_2,以此类推),艮口 text_str 中, 从T_headpos_k至T tailpo_k之间的字符串,和query_str完全相同。4. GBK奇偶校验模块该模块在获取字符基础查询模块所得的基础查询结果headp0S_k和tailp0S_k之后,进行编码校验。具体处理流程为步骤A 1)设置步长计数器count初始为0 ;2)沿 headpos_k 向前,依次检测字节 T_i (i = headposl-1,headposl-2··· ·,0);3)计算T_i&0x80是否为0(这里运算参数取0x80的原因为,按照GBK编码的规贝U,高字节的编码范围大于等于0x80是合法汉字高字节开始的标志)。其中符号&表示按位进行布尔“与”运算,与运算(And)规则为0&0 = 0,0&1 = 0,1&0 = 0,1&1 = 1 ;按位与运算为,将字节以二进制展开,并对每一位进行与计算,例如如果T i = 0x9E,则二进制表示为 10011110 ;而 0x80 的二进制展开为 10000000。此时:T_i&0x80 = 10011110&10000000 =10000000 ;4)根据T_i&0x80运算的数值,进行以下处理逻辑-如果等于0,则记录head_Valid=1 ;并终止本步骤后续流程,直接进入下面的步骤B ;-如果不等于0,则将计数器count= coimt+1,再根据T i的数值,进行以下两个处理子逻辑如果i = 0(即表示已经到字符串的首部),则终止该步骤,并输出count数值;如果i > 0,则将T_i设为T_i_l,并重新执行上述步骤A的运算,即继续沿本字符串向前检测;5)当步骤A中以上处理正常完成后,判断步长计数器count的奇偶值-如果count 为奇数,则记录 head_valid = 0 ;-如果count 为偶数,则记录 head_valid = 1。步骤B 1)设置步长计数器count初始为0 ;2)沿 tailpos_k 向后,依次检测字节 T_i(i = tailpos+1,tailposl+2... ·);3)计算T_i&0x80是否为0 (方法和步骤A相同);4)根据T_i&0x80运算的数值,进行以下处理逻辑-如果等于0,则记录tailjalid= 1,并终止本步骤后续流程;-如果不等于0,则将计数器count= coimt+1,再根据T_i的数值,进行以下两个处理子逻辑如果i = text_str. length(表示i和当前字符串text_str的长度相同,即已经到字符串的尾部),则终止该步骤,并输出count数值;如果i < text_Str· length,则将T_i设为T_i+1,并重新执行上述步骤的运算,即沿本字符串继续向后检测;5)当步骤B中以上处理正常完成后,判断步长计数器count的奇偶值-如果count 为奇数,则记录 tail_valid = 0 ;-如果count 为偶数,则记录 tail_valid = 1。5.汉字边界验证模块将GBK奇偶校验模块的结果输入汉字边界验证模块,进行处理。根据head_Valid 和tail_valid的数值,来判断headpos_i和tailpos_i是否处在GBK双字节汉字的边界上, 处理逻辑为-如果head_valid= 1且tail_valid = 1时,认为当前GBK字符的匹配结果有效,将该次查询所得的匹配信息headp0S_k,tailpos_k进行记录;-如果head_valid= 0或tail_valid = 0时,认为当前GBK字符的匹配结果无效,忽略本次匹配结果,并设置k = k+Ι,继续返回GBK奇偶校验模块,重新进行下一个查询位置的验证工作;6.输出GBK字符查询结果以上判断完毕后,则循环进行字符串后续查询位置的验证,处理逻辑为-如果k已是字符基础查询模块的最后一个匹配结果,则结束本次查询的所有验证工作,将成功匹配的全部headp0S_k,tailp0S_k信息(即GBK字符查询结果)进行输出。-如果k不是字符基础查询模块最后一个匹配结果,则设置k= k+Ι,继续返回GBK 奇偶校验模块,重新进行下一个查询位置的验证工作。本发明提出的一种基于奇偶校验的GBK字符查询系统,该系统针对GBK编码的字符串,在进行字符查询时,由于汉字高低字节编码交叉容易导致的误匹配问题,提出了一套查询系统,该系统由字符基础查询模块、GBK奇偶校验模块、汉字边界验证模块三部分组成, 利用汉字双字节编码的特点,使用了向前向后双向奇偶校验的方法,对字符匹配结果进行逐一验证,该系统的实践证明能很好的处理GBK字符查询的问题,既能剔除高低字节误匹配的结果,又能保留合法匹配的结果。
权利要求
1.一种基于奇偶校验的GBK字符查询系统,其特征在于,该系统包括三个模块字符基础查询模块、GBK奇偶校验模块和汉字边界验证模块;该字符基础查询模块用于对读取的GBK编码字符串与查询字符串进行基础查询,在 GBK编码字符串中找到满足查询字符串出现的位置,并记录其起始位置和终止位置;该GBK奇偶校验模块用于对该字符基础查询模块所得的基础查询结果进行编码校验, 首先沿起始位置向前依次检测字节以判断步长计数器count的奇偶值,然后沿终止位置向后依次检测字节以判断步长计数器count的奇偶值;该汉字边界验证模块用于根据该GBK奇偶校验模块的奇偶值校验结果来判断起始位置和终止位置是否处在GBK双字节汉字的边界上。
2.如权利要求1所述的基于奇偶校验的GBK字符查询系统,其特征在于,所述字符基础查询模块的查询方式为从左至右依次扫描GBK编码字符串,找到满足查询字符串出现的位置,并进行记录起始位置为headp0S_k,终止位置为tailp0S_k,其中数字k表示在当前GBK 编码字符串中第k次基础查询匹配到的结果。
3.如权利要求2所述的基于奇偶校验的GBK字符查询系统,其特征在于,所述GBK奇偶校验模块中沿起始位置向前依次检测字节以判断步长计数器count的奇偶值具体采用如下方法首先,将步长计数器count初始设为0 ;然后,沿headp0S_k向前,依次检测字节T_ i,其中 i =headposl-l,headposl-2....,0 ;然后,计算 T_i&0x80 是否为 0,并根据 T_i&0x80 运算的数值进行处理逻辑;最后判断步长计数器count的奇偶值,如果count为奇数,则记录 head_valid = 0 ;如果 count 为偶数,则记录 head_valid = 1。
4.如权利要求2所述的基于奇偶校验的GBK字符查询系统,其特征在于,所述GBK奇偶校验模块中沿终止位置向后依次检测字节以判断步长计数器count的奇偶值具体采用如下方法首先,将步长计数器count初始设为0 ;然后,沿tailp0S_k向后,依次检测字节 T_i,其中 i = tailpos+l,tailposl+2....;然后,计算 T_i&0x80 是否为 0,并根据 T_i&0x80 运算的数值进行处理逻辑;最后判断步长计数器count的奇偶值,如果count为奇数,则记录 tail_valid = 0 ;如果 count 为偶数,则记录 tail_valid = 1。
5.如权利要求3或4所述的基于奇偶校验的GBK字符查询系统,其特征在于,所述汉字边界验证模块的验证方法具体为如果head_valid = 1且tailjalid = 1,则当前GBK 字符的匹配结果有效,将该次查询所得的匹配信息headp0S_k,行记录;如果 head_valid = 0或tailjalid = 0,则当前GBK字符的匹配结果无效,忽略本次匹配结果, 并设置k = k+Ι,继续返回GBK奇偶校验模块,重新进行下一个查询位置的验证工作,直至k 为字符基础查询模块的最后一个匹配结果才结束查询,输出查询结果。
6.一种基于奇偶校验的GBK字符查询系统的实现方法,其特征在于,包括如下步骤(1)读取GBK编码的字符串,导入到给定字符串中,以text_str标记;(2)读取查询字符串,标记为query_str;(3)将query_str和text_str进行基础查询,方式为从左至右依次扫描text_str,找到满足query_str出现的位置,并进行记录起始位置为headp0S_k,终止位置为tailp0S_k, 其中数字k表示在当前串teXt_Str中第k次基础查询匹配到的结果;(4)在获取步骤(3)的基础查询结果headp0S_k*tailp0S_k2后进行编码校验,具体为步骤A 沿headp0S_k向前依次检测字节T_i以判断步长计数器count的奇偶值,其中,i = headposl-l,headposl-2···.,0 ;步骤 B 沿 tailpos_k 向后依次检测字节 T_i 以判断步长计数器count的奇偶值,其中i = tailpos+1, tailposl+2-.;(5)根据步骤的奇偶值校验结果来判断headpos」和tailpos」是否处在GBK双字节汉字的边界上;(6)输出GBK字符查询结果。
7.如权利要求6所述的基于奇偶校验的GBK字符查询系统的实现方法,其特征在于,在步骤(4)中,所述步骤A具体为1)将步长计数器count初始设为0 ;2)沿headp0S_k向前, 依次检测字节 T_i,其中,i = headposl-1, headposl-2····,0 ;3)计算 T_i&0x80 是否为 0 ; 4)根据T_i&0x80运算的数值进行如下处理逻辑如果T_i&0x80等于0,则记录head_valid =1,并终止本步骤后续流程,直接进入步骤B ;如果T_i&0x80不等于0,则将计数器count =coimt+1,再根据T_i的数值,进行以下两个处理子逻辑如果i = 0,则终止该步骤,并输出count数值;如果i > 0,则将T_i设为T_i-1,并重新执行上述步骤A的运算,即继续沿本字符串向前检测;5)判断步长计数器count的奇偶值,如果count为奇数,则记录head_ valid = 0 ;如果 count 为偶数,则记录 head_valid = 1。
8.如权利要求6所述的基于奇偶校验的GBK字符查询系统的实现方法,其特征在于,在步骤⑷中,所述步骤B具体为1)将步长计数器count初始设为0 ;2)沿tailp0S_k向后, 依次检测字节T_i,其中i = tailp0S+l,tailp0Sl+2….;3)计算T_i&0x80是否为0 ;4)根据T_i&0x80运算的数值进行如下处理逻辑如果T_i&0x80等于0,则记录tailjalid = 1,并终止本步骤后续流程;如果T_i&0x80不等于0,则将计数器count = coimt+1,再根据 T_i的数值,进行以下两个处理子逻辑如果i和当前字符串teXt_Str的长度相同,则终止该步骤,并输出count数值;如果i <当前字符串teXt_Str的长度,则将T_i设为T_i+1,并重新执行上述步骤B的运算,即沿本字符串继续向后检测力)判断步长计数器count的奇偶值,如果count为奇数,则记录tailjalid = 0 ;如果count为偶数,则记录tailjalid =1。
9.如权利要求6所述的基于奇偶校验的GBK字符查询系统的实现方法,其特征在于,步骤(5)具体为如果head_Valid = 1且tailjalid = 1时,则当前GBK字符的匹配结果有效,将该次查询所得的匹配信息1^£1(1 08_1^3£01 08_1^进行记录;如果head_valid = 0或 tailjalid = 0时,则当前GBK字符的匹配结果无效,忽略本次匹配结果,并设置k = k+1, 继续返回步骤,重新进行下一个查询位置的验证工作。
10.如权利要求6所述的基于奇偶校验的GBK字符查询系统的实现方法,其特征在于, 步骤(6)具体为如果k已是步骤(3)的最后一个匹配结果,则结束本次查询的所有验证工作,将成功匹配的全部符查询结果进行输出;如果k不是步骤(3) 最后一个匹配结果,则设置k = k+Ι,继续返回步骤(4),重新进行下一个查询位置的验证工作。
全文摘要
本发明公开了一种基于奇偶校验的GBK字符查询系统,包括字符基础查询模块、GBK奇偶校验模块和汉字边界验证模块;字符基础查询模块用于对读取的GBK编码字符串与查询字符串进行基础查询,在GBK编码字符串中找到满足查询字符串出现的位置,并记录起始位置和终止位置;GBK奇偶校验模块用于对字符基础查询模块所得的基础查询结果进行编码校验,采用向前向后的双向奇偶校验方法;汉字边界验证模块用于根据GBK奇偶校验模块的奇偶值校验结果判断起始位置和终止位置是否处在GBK双字节汉字的边界上。此外,本发明还公开了该系统的实现方法。本发明能查找并确定汉字的边界,从而成功解决汉字高低字节编码交叉容易导致的查询误匹配问题。
文档编号G06F17/30GK102479187SQ20101055548
公开日2012年5月30日 申请日期2010年11月23日 优先权日2010年11月23日
发明者陈运文 申请人:盛乐信息技术(上海)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1