手机版

Javascript实现汉字与拼音转换的终极方案

时间:2021-09-14 来源:互联网 编辑:宝哥软件园 浏览:

汉字和拼音的转换在很多地方都很常见。本文对网上常见的几个词典文件进行了精心整理和修改,简单打包了一个可以直接使用的工具库。如果有必要,我们来看看。

汉字到拼音:

汉字拼音:

普及汉字和拼音相关知识

汉字范围

一般认为Unicode编码中汉字的范围是/[\ u2e 80-\ u9ff]$/(11904-40959),但很多不是汉字或者可以读。本文使用的几个字典文件中的汉字范围是/[\ u4E00-\ u9Fa5] $/,即,

拼音组合

汉字有21个声母:b、p、m、f、d、t、n、l、g、k、h、j、q、x、zh、ch、sh、r、z、c、s、24个韵母,其中有6个单韵母:a、o、e,即Er、an、en、in、un、VN、ang、eng、ing、ong,如果声母和韵母成对组合,将有24X21=504个组合。其实有些组合是没有意义的,比如bv、gie、ve等。去掉这部分后,还剩下412个组合。

拼音词典文件

根据字典文件的大小从小到大。

词典1:拼音首字母

字典文件的内容大致如下:

/* * *拼音首字母字典文件*/var拼音_ dict _ first letter={ };拼音_ dict _ first letter . all=' ydyqsxmwzsxjbymgcczqpssqbycdscdqlybsjg . ';拼音_ dict _ first letter . polyphone={ ' 19969 ' : ' DZ ',' 19975':'WM ',' 19988':'QJ ',' 20048':'YL ',};在本数据字典中,将Unicode字符中4E00 (19968)- 9FA5 (40869)的20902个拼音首字母拼接在一起,得到一个长字符串,然后单独列出具有多音字(共370个多音字)的汉字。字典文件大小为25kb。

这个字典文件的优点是体积小,支持多音字,缺点是只能得到拼音的第一个字母。

字典2:常用汉字

词典文件按照拼音对汉字进行分类,共401个组合,其中常用汉字6763个,不支持多音字。由于从网络上收集的字数较少,文件大小只有24kb。看看以后有空能不能展开。

字典文件大致如下(这只是一个例子,所以只显示一小部分):

/* * *通用拼音数据字典,包含6763个常用汉字,不支持多音字*/var拼音_ dict _ notone={'an':' ah Ou ',' ai ' : ' ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai ai。Ang':' Hang Ang ',' ao': '敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖敖bang ',' bao':' Bulb and hail Bei': '贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝本本本本本本贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝贝北北北北北北北北北北北北北北北北北北北北北北北北北北北贝贝贝贝本本本本本后来,我慢慢发现这个字典文件中有很多错误,比如把骂人的拼音写成nue(正确写成nve),把撒谎写成thang,不支持多音字,所以后来我根据其他字典文件重新生成了一个这种格式的字典文件:

拼音组合有404种

它包含6763个常用汉字

支持多音字

不支持音调

文件大小为27kb

同时,根据网上一个常用的6763个汉字的使用频率表,我把这6763个汉字按照它们的使用频率进行了排序,从而实现了一个令人满意的JS输入法。

另外,根据另一个比较完整的词典文件,发现实际上有412个拼音组合,上面的词典文件中没有出现的8个读音是:

蔡,登,英,法奥,米,基,尼姑,她词典3:终极词典

首先,从网上找到的结构如下的字典文件(以下简称字典A),具体是记不住的,支持声调和多音字。它列出了4E00 (19968)- 9FA5 (40869)的所有拼音,共20902个汉字(如果你数10个,则为20903个)的Unicode字符。字典文件的大小是280kb。

3007 (ling2)4E00 (yi1)4E01 (ding1,Zheng 1)4e 02(Kao 3)4e 03(qi1)4e 04(Shang 4,Shang 3)4e 05(Xia 4)4e 06(none 0)4e 07(wan4,mo4)4e 08(Zhang 4)4e 09(san1)4E0A(Shang 4,shang3)4E0B (xia4)4E0C (ji1)4E0D(吕布,bu2,fou3)4E0E.其中,无读音或无读音的汉字统一标注为none0,我统计过这样的汉字有525个。

以尽可能减小字典文件大小为目标,我发现上面的文件除了第一个(3007)都是连续的,所以我把它改成了下面的结构,文件大小从280kb减小到了117kb:

var拼音_dict_withtone='yi1,ding1 zheng1,kao3,qi1,shang4 shang3,xia4,none0,wan4 mo4,zhang4,san1,shang4 shang3,xia4,ji1,bu2 fou3,yu3 yu4 yu2,mian3,gai4,chou3,chou3,zhuan1,qie3 ju1 . ';这个字典文件的缺点是音调用数字标记。如果你想得到像Xi m: o m ng t ng Xu 那样的拼音,你需要一个算法把适当位置的字母转换成 m: ,,,,,,,,,,,,,,,,,

本来打算自己试着写一个转换方法,后来发现了下面的字典文件(以下简称字典B),里面有20867个汉字,也支持声调和复音字,但是声调直接标在字母上面。因为它列出了汉字,所以文件比较大,有327kb。大致内容如下:

{'a' : 'y,',' a' : ',' ha' :' h,A,k ',' ah' 3360' sh ,',' Short' :' m: I ',' love' : 'i ',' close' : 'i,i ','唉' : 'i ','碍' : 'i ',' cancer ' 3: 'I . Ai ' 333:

{': 'sh k',' : 'qin ',' : ' f ',' : 'mo ',' E ' : ' XT',e' : 'lng lng ',e' : 'h',E ' : ' qin wm ',' I' : 't',' Nian ' : ' ni

{ ' :' l ',' :' l ',' :' l ',' :' l ',' : ' l,l,n ',' : '

var拼音_dict_withtone='y,d ng zhng,k uo qio y,q,shng,Xia,HN,wn m ,' zhng,sn,shng shng,Xia,q j .';如何使用

我将这些字典文件放在一起,并简单地封装了解析方法。在使用中,可以根据实际需要引入不同的字典文件。

封装了3种方法:

/* * *获取汉字的拼音首字母* @param str汉字字符串,如果遇到非汉字,按原样返回* @param polyphone支持复调,默认为false,如果为true,将返回所有可能的组合数组*/pinyinutil . getfirst setter(str,polyphone);/* * *根据汉字获取拼音。如果不是汉字,直接返回原汉字。* @param str默认情况下,要转换的中文字符由空格分隔。* @param withtone返回结果是否包含音调。默认情况下,* @param复音支持复音。默认情况下为否*/pinyinutil。get拼音(str,splitter,带声调,多音字);/* * *拼音转换为汉字,只支持单个汉字,所有匹配的汉字组合都返回* @param拼音,单个汉字的拼音不能包含声调*/pinyinutil.gethanzi(拼音);以下是在不同场合如何使用的介绍。

如果你只需要拿到拼音首字母,

脚本类型=' text/JavaScript ' src=' http :拼音_ dict _ first letter . js '/Script Script类型=' text/JavaScript ' src=' http : pinyinutil . js '/Script脚本类型=' text/JavaScript ' pinyinutil . getfirst letter('小明同学');//输出XMTXpinyinUtil.getFirstLetter('大中华区',true);//输出['DZG ',' TZG ']/脚本。需要注意的是,如果导入另外两个字典文件,也可以得到拼音的首字母,只是说这个字典文件更适合。

如果拼音不需要声调

脚本类型=' text/JavaScript ' src=' http : pinyinutil _ dict _ no letter . js '/script script type=' text/JavaScript ' src=' http : pinyinutil . js '/script script type=' text/JavaScript ' pinyinutil .get拼音('小明//输出'小童鸣学' pinyinutil.gethanzi('明');//输出'明明明明明明唐明'/脚本如果需要语气或者需要处理生僻字,

脚本类型=' text/JavaScript ' src=' http : pinyinutil _ dict _ with letter . js '/script script type=' text/JavaScript ' src=' http 3360 pinyinutil . js '/script script type=' text/JavaScript ' pinyinutil .get拼音('小明//output ' Xi m:ong tng Xu' pinyinutil .get拼音('小明同学','-',true,true);//输出[' Xi m:o-Ming-tng-Xue ',' Xi m:o-Ming-tng-Xue ']/关于简易拼音输入法的脚本

一个正式的输入法要考虑的东西太多了,比如词库、用户的个人输入习惯等。这里只是最简单的输入法,没有任何词库(虽然添加一下也可以,web环境不适合引入太大的文件)。

建议使用第二个字典文件拼音_ dict _ noletter.js,虽然字典有三个以上的字,但是不能按照使用汉字的频率排序,有些生僻字反而排在第一位。

link rel='样式表' type=' text/CSS ' href=' simple-input-method/simple-input-method . CSS ' input type=' text ' class=' test-input-method '/script type=' text/JavaScript ' src=' http3360 pinyinutil . js '/script script type=' text/JavaScript '测试输入方法’);/脚本摘要

因为这个工具类的目标环境是web,而web注定要让文件大小不要太大,所以不能引入太大的词库文件。由于没有词库支持,复音词无法识别,实现的拼音输入法无法智能匹配合适的词。以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助。

版权声明:Javascript实现汉字与拼音转换的终极方案是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。