/** * 汉字与拼音互转工具,根据导入的字典文件的不同支持不同 * 对于多音字目前只是将所有可能的组合输出,准确识别多音字需要完善的词库,而词库文件往往比字库还要大,所以不太适合web环境。 * @start 2016-09-26 * @last 2016-09-29 */ ;(function(global, factory) { if (typeof module === "object" && typeof module.exports === "object") { module.exports = factory(global); } else { factory(global); } })(typeof window !== "undefined" ? window : this, function(window) { var dict = {}; // 存储所有字典数据 var pinyinUtil = { /** * 解析各种字典文件,所需的字典文件必须在本JS之前导入 */ parseDict: function() { // 如果导入了 pinyin_dict_firstletter.js if(window.pinyin_dict_firstletter) { dict.firstletter = pinyin_dict_firstletter; } // 如果导入了 pinyin_dict_notone.js if(window.pinyin_dict_notone) { dict.notone = {}; dict.py2hz = pinyin_dict_notone; // 拼音转汉字 for(var i in pinyin_dict_notone) { var temp = pinyin_dict_notone[i]; for(var j=0, len=temp.length; j 汉字 if(window.pinyin_dict_notone) { // 对于拼音转汉字,我们优先使用pinyin_dict_notone字典文件 // 因为这个字典文件不包含生僻字,且已按照汉字使用频率排序 dict.py2hz = pinyin_dict_notone; // 拼音转汉字 } else { // 将字典文件解析成拼音->汉字的结构 // 与先分割后逐个去掉声调相比,先一次性全部去掉声调然后再分割速度至少快了3倍,前者大约需要120毫秒,后者大约只需要30毫秒(Chrome下) var notone = pinyinUtil.removeTone(pinyin_dict_withtone).split(','); var py2hz = {}, py, hz; for(var i=0, len = notone.length; i= 19968 && unicode <= 40869) { ch = dict.firstletter.all.charAt(unicode-19968); if(polyphone) ch = dict.firstletter.polyphone[unicode] || ch; } result.push(ch); } if(!polyphone) return result.join(''); // 如果不用管多音字,直接将数组拼接成字符串 else return handlePolyphone(result, '', ''); // 处理多音字,此时的result类似于:['D', 'ZC', 'F'] } else { var py = this.getPinyin(str, ' ', false, polyphone); py = py instanceof Array ? py : [py]; var result = []; for(var i=0; i