Java中获取GBK编码汉字的拼音字头方法。

     汉字的编码,需要大家先了解下。

 

GB2312

GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。

GB2312 收录简化汉字及符号、字母、日文假名等共 7445 个图形字符,其中汉字占 6763 个。GB2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。

GB2312 将代码表分为 94 个区,对应第一字节;每个区 94 个位,对应第二字节,两个字节的值分别为区号值和位号值加 32(2OH),因此也称为区位码。01-09 区为符号、数字区,16-87 区为汉字区,10-15 区、88-94 区是有待进一步标准化的空白区。GB2312 将收录的汉字分成两级:第一级是常用汉字计 3755 个,置于 16-55 区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。故而GB2312最多能表示 6763 个汉字。

GB2312 的编码范围为 2121H-777EH,与 ASCII 有重叠,通行方法是将 GB 码两个字节的最高位置 1 以示区别。

GBK

GB2312 仅收汉字 6763 个,这大大少于现有汉字,随着时间推移及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,例如:朱镕基的“镕”字,未收入 GB2312-80,现在大陆的报业出刊只得使用(金+容)、(金容)、(左金右容)等来表示,形式不一而同,这使得表示、存储、输入、处理都非常不方便,对于搜索引擎等软件的构造来说也不是好消息,而且这种表示没有统一标准。从我们对人民日报 98 年数据的处理过程中,得出这样的经验:回填外字最困难的就是如何得到这种表示方法的集合。

为了解决这些问题,以及配合 UNICODE 的实施,全国信息技术化技术委员会于1995年12月1日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。

GBK 共收入 21886 个汉字和图形符号,包括:

* GB2312 中的全部汉字、非汉字符号。
* BIG5 中的全部汉字。
* 与 ISO 10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
* 其它汉字、部首、符号,共计 984 个。

微软公司自 Windows 95 简体中文版开始支持GBK代码,但目前的多数搜索引擎都不能很好地支持 GBK 汉字。

GBK 编码区分三部分:

* 汉字区,包括:

  • GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;
  • GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;
  • GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。

* 图形符号区,包括:

  • GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号
  • GBK/5:OXA840-A9AO,扩除非汉字区。

* 用户自定义区:

  • 即 GBK 区域中的空白区,用户可以自己定义字符。

相关程序

由于字库较大,程序中省略了字库部分,完整程序,请到我的资源去下载 http://download.csdn.net/source/3161588 。

 /* * GetPy.java */ package net.csdn.blog.z3h.util; /** * 取得汉字拼音码. * 支持GBK大字符集. * @author Zhao Honghui * @version 1.0 */ public class GetPy { private static final String GB_2312 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbp" + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbpbbbbbbbbbbbbbbbbbb" + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + //详细编码见附件,此处省略. "cyxyqdlqcafywyxqhz"; private static final String GBK_3 = "ksxsm sdqlybjjjgczbjfya jhphsyzgj sn xy ng" + " lggllyjds yssgyqyd xjyydldwjjwbbftbxthhbczcrfm" + "qwyfcwdzpyddwyxjajpsfnzyjxxxcxnnxxzzbpysyzhmzbqbzc" + //详细编码见附件,此处省略. "jysylpnyyxdb"; private static final String GBK_4 = "kxxmzjxsttdzxxbzyshjpfxpqbyljqkyzzzwl zgfwyctjxjpy" + "yspmsmydyshqy zchmjmcagcfbbhplxtyqx djgxdhkxxnbhrm" + "lnjsltsmrnlxqjyzlsqglbhdcgyqyyhwfjybbyjyjjdpqyapfx" + //详细编码见附件,此处省略. " sypszsjczc cqytsjljjt "; /** * 获取GBK字的拼音的首字母 * 由于数据较大,完整的GBK编码表按GBK规范分成3部分 * GBK/2为与GB2312兼容的国标汉字部分,GBK/3和GBK/4为扩展汉字部分 * 每一部分都有自己的地址计算公式 * 若输入是acsii则返回同样的acsii * 若输入是中文字符则返回拼音的首字母 * 若输入是中文字符但是该字符不知道如何发音,则返回空字符 * @param hzString * @return String */ public static String getGBKpy(String hzString) { /* * 效率:处理大字符串(字符串有132055个byte,即70577个char)1000次,消耗时间44.474S. */ if (hzString == null || hzString.length() == 0) return ""; int pyi, len, no; int ch1code = 0, ch2code = 0; char ch1, ch2; StringBuffer pyBuffer = new StringBuffer(); byte eB[] = hzString.getBytes(); len = eB.length; //开始计算 pyi = 0; while (pyi < len) { ch1 = (char) eB[pyi]; pyi = pyi + 1; ch1code = ch1; if (ch1code > 0 && ch1code < 129) { //普通的acsii pyBuffer.append(ch1); continue; } else { //GBK字符 ch1 = (char) (256 + (int) ch1); if (eB[pyi] < 0) { ch2 = (char) (256 + (int) eB[pyi]); } else { ch2 = (char) eB[pyi]; } pyi = pyi + 1; if (pyi > len) break; } ch1code = ch1; ch2code = ch2; if (ch1code <= 254 && ch1code >= 170) { //优先处理GB-2312汉字. if (ch2code > 160) { //查找GB-2312 no = (ch1code - 176) * 94 + (ch2code - 160); pyBuffer.append(GB_2312.charAt(no - 1)); } else { //查找GBK_4 no = (ch1code - 170) * 97 + (ch2code - 63); pyBuffer.append(GBK_4.charAt(no - 1)); } }else if (ch1code <= 160 && ch1code >= 129) { //查找GBK_3 no = (ch1code - 129) * 191 + (ch2code - 63); pyBuffer.append(GBK_3.charAt(no - 1)); } else { //不是GBK汉字 continue; } } return pyBuffer.toString().trim().toLowerCase(); } }

使用 方法:

String hzString = "你好"; System.out.println(GetPy.getGBKpy(hzString));

 

总结

对于,其他编码,只要有了字符编码,就可以处理了。本程序的效率如下,处理大字符串(字符串有132055个byte,即70577个char)1000次,消耗时间44.474S,在500M笔记本测试的。

源码下载地址:http://download.csdn.net/source/3161588。

你可能感兴趣的:(Java中获取GBK编码汉字的拼音字头方法。)