加入收藏 | 设为首页 | 会员中心 | 我要投稿 湘西站长网 (https://www.0743zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 模式 > 正文

JavaScript优化篇:汉字转换为拼音

发布时间:2018-08-18 17:46:53 所属栏目:模式 来源:站长网
导读:网上类似的例子层出不穷,但大多万变不离其宗:把所有读音相同的字放在一行,这一行对应一个拼音;转换时搜索汉字所在的行,然后读取这行对应的拼音即可。且不说效率如何,单是记录下所有的汉字就是一个不小的空间。即使是常用的汉字就有近7000个,若是要

  网上类似的例子层出不穷,但大多万变不离其宗:把所有读音相同的字放在一行,这一行对应一个拼音;转换时搜索汉字所在的行,然后读取这行对应的拼音即可。且不说效率如何,单是记录下所有的汉字就是一个不小的空间。即使是常用的汉字就有近7000个,若是要包括“囧”这类的GBK汉字则超过20000,光是记录就有40 K之多。

  显然这其中还有很大的改进空间。先琢磨下汉字的相关属性。GBK字库共有汉字20902个,而汉字的读音,即声母韵母的组合,不过400。平均读音相同50左右。假如能够得到从a-z按拼音顺序排列的所有汉字,那么每50个只需记录其第一个即可,就像关键帧一样可以导出其他所有。但汉字的Unicode并非是按读音排列的,所以必须得找个突破口。
回忆下String类的相关方法,与汉字的读音顺序有关对了,String.localeCompare!你或多或少见过汉字排序的例子,此方法正是利用汉字的本地顺序对其排序。

  而本地顺序正是拼音顺序!到这里,便是豁然开朗了。先罗列出所有的汉字(0x4e00-0x9fa5),然后再按本地顺序排序,即是所谓的字典顺序了。

  效果出现了,但效率却并不理想。跟踪下a.localeCompare(b)的次数,大约53万,虽不多,但IE却要运行上2秒的时间(双核2.5,IE6)。虽然此处只需运行一次而已,但仍然不是最理想的,仍需改进。

  这里再提一次汉字的数量:2万多个,但实际的应用中用到的不过1/4而已。显然没有必要把所有的汉字都搬出来,倒不如运行时再根据每个汉字查询相应的拼音。二分法查询在此自然是能够大显身手了。

  二分法大家都知道,每次取其半,然后再递归虽然读音范围有400多,但只需8次判断就能够确定。唯一不同的就是判断的地方用localeCompare代替。对于转换过的汉字将其缓存,以后直接从缓存读取即可。

  到此,大功告成。不过有点遗憾的是OperaChrome没有按照标准实现localeCompare。他们返回的居然是两者的Unicode之差(无语)

  演示(由于多音字,生僻字的问题,其中有不少错误的地方):


提示:可修改后代码再运行!

(编辑:湘西站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读