本着将字典文件尽可能减小体积的目标,发现上述文件中除了第一个〇(3007)之外,其它都是连续的,所以我把它改成了如下结构,文件体积也从 280kb 减小到了 117kb :
var pinyin_dict_withtone = "yi1,ding1 zheng1,kao3,qi1,shang4 shang3,xia4,none0,wan4 mo4,zhang4,san1,shang4 shang3,xia4,ji1,bu4 bu2 fou3,yu3 yu4 yu2,mian3,gai4,chou3,chou3,zhuan1,qie3 ju1...";
该字典文件的缺点是声调是用数字标出的,如果想要得出类似 xiǎo míng tóng xué 这样的拼音的话,需要一个算法将合适位置的字母转换成 āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň 。
本来还准备自己尝试写一个转换的方法的,后来又找到了如下 字典文件 (下面称为字典B),它收录了20867个汉字,也支持声调和多音字,但是声调是直接标在字母上方的,由于它将汉字也列举出来,所以文件体积比较大,有 327kb ,大致内容如下:
{ "吖": "yā,ā", "阿": "ā,ē", "呵": "hē,a,kē", "嗄": "shà,á", "啊": "ā,á,ǎ,à,a", "腌": "ā,yān", "锕": "ā", "錒": "ā", "矮": "ǎi", "爱": "ài", "挨": "āi,ái", "哎": "āi", "碍": "ài", "癌": "ái", "艾": "ài", "唉": "āi,ài", "蔼": "ǎi" /* 省略其它 */ }
但是经过比对,发现有502个汉字是字典A中读音为 none 但是字典B中有读音的,还有21个汉字是字典A中有但是B中没有的:
{ "兙": "shí kè", "兛": "qiān", "兝": "fēn", "兞": "máo", "兡": "bǎi kè", "兣": "lǐ", "唞": "dǒu", "嗧": "jiā lún", "囍": "xǐ", "堎": "lèng líng", "猤": "hú", "瓩": "qián wǎ", "礽": "réng", "膶": "rùn", "芿": "rèng", "蟘": "tè", "貣": "tè", "酿": "niàng niàn niáng", "醸": "niàng", "鋱": "tè", "铽": "tè" }
还有7个汉字是B中有但是A中没有的:
{ "㘄": "lēng", "䉄": "léng", "䬋": "léng", "䮚": "lèng", "䚏": "lèng,lì,lìn", "㭁": "réng", "䖆": "niàng" }
所以我在字典A的基础上将二者进行了合并,得到了最终的字典文件 pinyin_dict_withtone.js ,文件大小为 122kb :
var pinyin_dict_withtone = "yī,dīng zhēng,kǎo qiǎo yú,qī,shàng,xià,hǎn,wàn mò,zhàng,sān,shàng shǎng,xià,qí jī...";
如何使用
我将这几种字典文件放在一起并简单封装了一下解析方法,使用中可以根据实际需要引入不同字典文件。
封装好的3个方法:
/** * 获取汉字的拼音首字母 * @param str 汉字字符串,如果遇到非汉字则原样返回 * @param polyphone 是否支持多音字,默认false,如果为true,会返回所有可能的组合数组 */ pinyinUtil.getFirstLetter(str, polyphone); /** * 根据汉字获取拼音,如果不是汉字直接返回原字符 * @param str 要转换的汉字 * @param splitter 分隔字符,默认用空格分隔 * @param withtone 返回结果是否包含声调,默认是 * @param polyphone 是否支持多音字,默认否 */ pinyinUtil.getPinyin(str, splitter, withtone, polyphone); /** * 拼音转汉字,只支持单个汉字,返回所有匹配的汉字组合 * @param pinyin 单个汉字的拼音,不能包含声调 */ pinyinUtil.getHanzi(pinyin);
下面分别针对不同场合如何使用作介绍。
如果你只需要获取拼音首字母
<script type="text/javascript" src="https://www.jb51.net/pinyin_dict_firstletter.js"></script> <script type="text/javascript" src="https://www.jb51.net/pinyinUtil.js"></script> <script type="text/javascript"> pinyinUtil.getFirstLetter('小茗同学'); // 输出 XMTX pinyinUtil.getFirstLetter('大中国', true); // 输出 ['DZG', 'TZG'] </script>
需要特别说明的是,如果你引入的是其它2个字典文件,也同样可以获取拼音首字母的,只是说用这个字典文件更适合。
如果拼音不需要声调
<script type="text/javascript" src="https://www.jb51.net/pinyin_dict_noletter.js"></script> <script type="text/javascript" src="https://www.jb51.net/pinyinUtil.js"></script> <script type="text/javascript"> pinyinUtil.getPinyin('小茗同学'); // 输出 'xiao ming tong xue' pinyinUtil.getHanzi('ming'); // 输出 '明名命鸣铭冥茗溟酩瞑螟暝' </script>
如果需要声调或者需要处理生僻字