也说汉字转拼音

也说汉字转拼音
由于项目中需要把汉字转成拼音,并且是涉及到姓名的转换,因此不能排除有生僻字的可能.我先是查了一下汉字编码的知识,汉字编码知识如下:
http://www.knowsky.com/resource/gb2312tbm.htm;这里说的是区位码,实际上区位码和汉字GBK码就是同一个东西, 在区位码的区号和位号上分别加上0xA0就得到了GB2312编码了,但是一看编码规律,只有第一次汉字和读音挂钩,第二级汉字是按照部首进行编排的,所以应该是没有什么绝对的关系的。于是又在网上找其他的资料,用java实现的,网上流传广泛的有两种方法:但是就我来看都不怎么的,第一种是把汉字读音和相应区的汉字对照;但是只是涉及了常用的汉字,遇到生僻字是不能转换的;第二种号称完整版的方法,居然把汉字码表的基本对应关系放到了java类中,并且还说什么为了防止函数字符超过65535长度的限制,用了100多个init函数.我实在是不能理解.其实我想得很简单:找一个汉字拼音对照表,然后初始化时读入到HashMap中,用汉字为Key,用拼音作为value,然后就可以获取了.不过也考虑过,GBK码表的长度有27954个汉字,从来没有用HashMap处理过如此长度得东西,不知道会不会有什么限制,不过随便想了一下应该不可能:第一java HashMap的长度不受此限制;第而,查找汉字时,在HashMap中肯定时用二分法或者更好得算法来取Value,那么最坏的情况也不过时lg2(27954),这是很快的.很快实现了,试了一下性能还不错,在我的机器上:init的时间200ms,查找一个汉字的平均时间为8ms.其实之前我还想过加快速度的更好的方法:把这个汉字编码表自己先处理一遍,先利用冒泡排序法,把编码对应在数据文件里排好,给每个读音汉字对照分配固定的足够长的字符宽度,对于编码中没有汉字的区域,用空白代替;这样汉字的拼音编码关系就和汉字本身的编码建立了联系,减去第一个汉字的编码值,就可以得到汉字拼音在数据文件中绝对位置了,然后就可以根据汉字本身的编码然后用文件随机读取的方法,取到拼音值,不知道这样是不是会比用hashMap的方法要快一点?不过既然HashMap的方案可行了.那么就暂时不取测试了.
相关的资料:
(1) GBK汉字全拼音单字源码表
(2) 单字多音码表

你可能感兴趣的:(也说汉字转拼音)