JavaScript优化篇:汉字转换为拼音
网上相同的例子层出不穷,但大多万变不离其宗:把全部读音沟通的字放在一行,这一行对应一个拼音;转换时搜刮汉字地址的行,然后读取这行对应的拼音即可。且不说服从怎样,单是记录下全部的汉字就是一个不小的空间。纵然是常用的汉字就有近7000个,如果要包罗“囧”这类的GBK汉字则高出20000,光是记录就有40 K之多。 显然这个中尚有很大的改造空间。先琢磨下汉字的相干属性。GBK字库共有汉字20902个,而汉字的读音,即声母韵母的组合,不外400。均匀读音沟通50阁下。若是可以或许获得从a-z按拼音次序分列的全部汉字,那么每50个只需记录其第一个即可,就像要害帧一样可以导出其他全部。但汉字的Unicode并非是按读音分列的,以是必需得找个打破口。 而当地次序正是拼音次序!到这里,即是豁然爽朗了。先摆列出全部的汉字(0x4e00-0x9fa5),然后再按当地次序排序,等于所谓的字典次序了。
结果呈现了,但服从却并不抱负。跟踪下a.localeCompare(b)的次数,约莫53万,虽不多,但IE却要运行上2秒的时刻(双核2.5,IE6)。固然此处只需运行一次罢了,但如故不是最抱负的,仍需改造。 这里再提一次汉字的数目:2万多个,但现实的应用顶用到的不外1/4罢了。显然没有须要把全部的汉字都搬出来,倒不如运行时再按照每个汉字查询响应的拼音。二分法查询在此天然是可以或许大显技艺了。 二分法各人都知道,每次取其半,然后再递归固然读音范畴有400多,但只需8次判定就可以或许确定。独一差异的就是判定的处所用localeCompare取代。对付转换过的汉字将其缓存,往后直接从缓存读取即可。 到此,大功告成。不外有点遗憾的是Opera与Chrome没有凭证尺度实现localeCompare。他们返回的居然是两者的Unicode之差(无语) 演示(因为多音字,生僻字的题目,个中有不少错误的处所):
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |