vulcan

低头做事,抬头看路

   :: 首页 :: 联系 :: 聚合  :: 管理
  41 Posts :: 7 Stories :: 28 Comments :: 0 Trackbacks
由于项目中需要把汉字转成拼音,并且是涉及到姓名的转换,因此不能排除有生僻字的可能.我先是查了一下汉字编码的知识,汉字编码知识如下:
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) 单字多音码表

posted on 2008-01-24 10:50 vulcan 阅读(2154) 评论(6)  编辑  收藏

Feedback

# re: 也说汉字转拼音 2008-05-16 10:49 yizhyi@163.com
那对 多音字 你怎么处理的来?
代码可否发一份给我: yizhyi@163.com
谢谢  回复  更多评论
  

# re: 也说汉字转拼音 2008-05-23 18:49 vulcan
多音字的处理:
我写了一个Python脚本,把这个单字码表转换了一下,换成了这样的形式:
汉字:读音1,读音2//换行
读入到java Hash中,是以汉字为Key,字符串数组为Value的Hash表。我的应用情况比较特殊,是用于人名的转换;而用于人名的汉字读音一般是固定的,所以就很好处理了。另外,处理后的单字多音码表我传到上文中了。  回复  更多评论
  

# re: 也说汉字转拼音 2008-06-19 16:10
像麒麟这样的生僻字用java
怎么转换啊  回复  更多评论
  

# re: 也说汉字转拼音 2009-02-22 14:32 湘江一角
大哥,能不能发一份源代码给我,现在也是多音字上面犯愁。邮箱:luoguanghua@hotmail.com  回复  更多评论
  

# re: 也说汉字转拼音 2010-12-09 19:22 liuboram
同样的问题,能否把代码共享一下呢?liuborama@gmail.com
多谢了  回复  更多评论
  

# re: 也说汉字转拼音 2012-11-14 19:22 hikaruxx
你好,能不能发一份源代码?ziven000@163.com
谢谢  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: