软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > Web前端 > Ajax/JavaScript > JavaScript优化篇:汉字转换为拼音

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

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

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

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

  <script>
var arr = [];
for(var i=0x4e00; i<=0x9fa5; i++)
 arr[i-0x4e00] = i;
arr = String.fromCharCode.apply(null, arr).split("");
arr.sort(function(a,b){return a.localeCompare(b)});
document.write(arr);
</script>

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

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

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

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

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


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

    相关阅读
    栏目导航
    推荐软件