JavaScript实现中文转拼音
1、问题背景:
在做项目时候遇到一个小小的显示客户部门名称(拼音)的业务,就是在部门名称下有相应的拼音,而在现有的数据库中没有相应字段,并且部门数量比较多,添加起来比较费时,就想能否在js中实现,在页面中处理。
2、原理描述
程序原理很简单,网上可以找到汉字拼音的数据字典,但是由于大家都知道GB2312编码里面汉字是按拼音排序的,只要知道各个拼音为首的汉字代码,就可以计算所有汉字的拼音代码了。
本文通过自定义用于存放汉字拼音与ascii码对应的数据字典,再通过将需要转换的汉字转为ascii码(两位),最后通过查找字典匹配即可,具体实现见代码。
3、实现代码:
javascript代码:
<script language="javascript" type="text/javascript"> function hash(_key,_value) { this.key = _key; /* 拼音*/ this.value = _value; /* ascii码*/ } /* javascript 的自定义对象,用于存放汉字拼音数据字典*/ function dictionary() { this.items = []; this.add = function(_key,_value) { this.items[this.items.length] = new hash(_key,_value); } } /*汉字拼音的数据字典-共396个-通过组合声母和韵母*/ var d = new dictionary(); d.add("a",-20319); d.add("ai",-20317); d.add("an",-20304); d.add("ang",-20295); d.add("ao",-20292); d.add("ba",-20283); d.add("bai",-20265); d.add("ban",-20257); d.add("bang",-20242); d.add("bao",-20230); d.add("bei",-20051); d.add("ben",-20036); d.add("beng",-20032); d.add("bi",-20026); d.add("bian",-20002); d.add("biao",-19990); d.add("bie",-19986); d.add("bin",-19982); d.add("bing",-19976); d.add("bo",-19805); d.add("bu",-19784); d.add("ca",-19775); d.add("cai",-19774); d.add("can",-19763); d.add("cang",-19756); d.add("cao",-19751); d.add("ce",-19746); d.add("ceng",-19741); d.add("cha",-19739); d.add("chai",-19728); d.add("chan",-19725); d.add("chang",-19715); d.add("chao",-19540); d.add("che",-19531); d.add("chen",-19525); d.add("cheng",-19515); d.add("chi",-19500); d.add("chong",-19484); d.add("chou",-19479); d.add("chu",-19467); d.add("chuai",-19289); d.add("chuan",-19288); d.add("chuang",-19281); d.add("chui",-19275); d.add("chun",-19270); d.add("chuo",-19263); d.add("ci",-19261); d.add("cong",-19249); d.add("cou",-19243); d.add("cu",-19242); d.add("cuan",-19238); d.add("cui",-19235); d.add("cun",-19227); d.add("cuo",-19224); d.add("da",-19218); d.add("dai",-19212); d.add("dan",-19038); d.add("dang",-19023); d.add("dao",-19018); d.add("de",-19006); d.add("deng",-19003); d.add("di",-18996); d.add("dian",-18977); d.add("diao",-18961); d.add("die",-18952); d.add("ding",-18783); d.add("diu",-18774); d.add("dong",-18773); d.add("dou",-18763); d.add("du",-18756); d.add("duan",-18741); d.add("dui",-18735); d.add("dun",-18731); d.add("duo",-18722); d.add("e",-18710); d.add("en",-18697); d.add("er",-18696); d.add("fa",-18526); d.add("fan",-18518); d.add("fang",-18501); d.add("fei",-18490); d.add("fen",-18478); d.add("feng",-18463); d.add("fo",-18448); d.add("fou",-18447); d.add("fu",-18446); d.add("ga",-18239); d.add("gai",-18237); d.add("gan",-18231); d.add("gang",-18220); d.add("gao",-18211); d.add("ge",-18201); d.add("gei",-18184); d.add("gen",-18183); d.add("geng",-18181); d.add("gong",-18012); d.add("gou",-17997); d.add("gu",-17988); d.add("gua",-17970); d.add("guai",-17964); d.add("guan",-17961); d.add("guang",-17950); d.add("gui",-17947); d.add("gun",-17931); d.add("guo",-17928); d.add("ha",-17922); d.add("hai",-17759); d.add("han",-17752); d.add("hang",-17733); d.add("hao",-17730); d.add("he",-17721); d.add("hei",-17703); d.add("hen",-17701); d.add("heng",-17697); d.add("hong",-17692); d.add("hou",-17683); d.add("hu",-17676); d.add("hua",-17496); d.add("huai",-17487); d.add("huan",-17482); d.add("huang",-17468); d.add("hui",-17454); d.add("hun",-17433); d.add("huo",-17427); d.add("ji",-17417); d.add("jia",-17202); d.add("jian",-17185); d.add("jiang",-16983); d.add("jiao",-16970); d.add("jie",-16942); d.add("jin",-16915); d.add("jing",-16733); d.add("jiong",-16708); d.add("jiu",-16706); d.add("ju",-16689); d.add("juan",-16664); d.add("jue",-16657); d.add("jun",-16647); d.add("ka",-16474); d.add("kai",-16470); d.add("kan",-16465); d.add("kang",-16459); d.add("kao",-16452); d.add("ke",-16448); d.add("ken",-16433); d.add("keng",-16429); d.add("kong",-16427); d.add("kou",-16423); d.add("ku",-16419); d.add("kua",-16412); d.add("kuai",-16407); d.add("kuan",-16403); d.add("kuang",-16401); d.add("kui",-16393); d.add("kun",-16220); d.add("kuo",-16216); d.add("la",-16212); d.add("lai",-16205); d.add("lan",-16202); d.add("lang",-16187); d.add("lao",-16180); d.add("le",-16171); d.add("lei",-16169); d.add("leng",-16158); d.add("li",-16155); d.add("lia",-15959); d.add("lian",-15958); d.add("liang",-15944); d.add("liao",-15933); d.add("lie",-15920); d.add("lin",-15915); d.add("ling",-15903); d.add("liu",-15889); d.add("long",-15878); d.add("lou",-15707); d.add("lu",-15701); d.add("lv",-15681); d.add("luan",-15667); d.add("lue",-15661); d.add("lun",-15659); d.add("luo",-15652); d.add("ma",-15640); d.add("mai",-15631); d.add("man",-15625); d.add("mang",-15454); d.add("mao",-15448); d.add("me",-15436); d.add("mei",-15435); d.add("men",-15419); d.add("meng",-15416); d.add("mi",-15408); d.add("mian",-15394); d.add("miao",-15385); d.add("mie",-15377); d.add("min",-15375); d.add("ming",-15369); d.add("miu",-15363); d.add("mo",-15362); d.add("mou",-15183); d.add("mu",-15180); d.add("na",-15165); d.add("nai",-15158); d.add("nan",-15153); d.add("nang",-15150); d.add("nao",-15149); d.add("ne",-15144); d.add("nei",-15143); d.add("nen",-15141); d.add("neng",-15140); d.add("ni",-15139); d.add("nian",-15128); d.add("niang",-15121); d.add("niao",-15119); d.add("nie",-15117); d.add("nin",-15110); d.add("ning",-15109); d.add("niu",-14941); d.add("nong",-14937); d.add("nu",-14933); d.add("nv",-14930); d.add("nuan",-14929); d.add("nue",-14928); d.add("nuo",-14926); d.add("o",-14922); d.add("ou",-14921); d.add("pa",-14914); d.add("pai",-14908); d.add("pan",-14902); d.add("pang",-14894); d.add("pao",-14889); d.add("pei",-14882); d.add("pen",-14873); d.add("peng",-14871); d.add("pi",-14857); d.add("pian",-14678); d.add("piao",-14674); d.add("pie",-14670); d.add("pin",-14668); d.add("ping",-14663); d.add("po",-14654); d.add("pu",-14645); d.add("qi",-14630); d.add("qia",-14594); d.add("qian",-14429); d.add("qiang",-14407); d.add("qiao",-14399); d.add("qie",-14384); d.add("qin",-14379); d.add("qing",-14368); d.add("qiong",-14355); d.add("qiu",-14353); d.add("qu",-14345); d.add("quan",-14170); d.add("que",-14159); d.add("qun",-14151); d.add("ran",-14149); d.add("rang",-14145); d.add("rao",-14140); d.add("re",-14137); d.add("ren",-14135); d.add("reng",-14125); d.add("ri",-14123); d.add("rong",-14122); d.add("rou",-14112); d.add("ru",-14109); d.add("ruan",-14099); d.add("rui",-14097); d.add("run",-14094); d.add("ruo",-14092); d.add("sa",-14090); d.add("sai",-14087); d.add("san",-14083); d.add("sang",-13917); d.add("sao",-13914); d.add("se",-13910); d.add("sen",-13907); d.add("seng",-13906); d.add("sha",-13905); d.add("shai",-13896); d.add("shan",-13894); d.add("shang",-13878); d.add("shao",-13870); d.add("she",-13859); d.add("shen",-13847); d.add("sheng",-13831); d.add("shi",-13658); d.add("shou",-13611); d.add("shu",-13601); d.add("shua",-13406); d.add("shuai",-13404); d.add("shuan",-13400); d.add("shuang",-13398); d.add("shui",-13395); d.add("shun",-13391); d.add("shuo",-13387); d.add("si",-13383); d.add("song",-13367); d.add("sou",-13359); d.add("su",-13356); d.add("suan",-13343); d.add("sui",-13340); d.add("sun",-13329); d.add("suo",-13326); d.add("ta",-13318); d.add("tai",-13147); d.add("tan",-13138); d.add("tang",-13120); d.add("tao",-13107); d.add("te",-13096); d.add("teng",-13095); d.add("ti",-13091); d.add("tian",-13076); d.add("tiao",-13068); d.add("tie",-13063); d.add("ting",-13060); d.add("tong",-12888); d.add("tou",-12875); d.add("tu",-12871); d.add("tuan",-12860); d.add("tui",-12858); d.add("tun",-12852); d.add("tuo",-12849); d.add("wa",-12838); d.add("wai",-12831); d.add("wan",-12829); d.add("wang",-12812); d.add("wei",-12802); d.add("wen",-12607); d.add("weng",-12597); d.add("wo",-12594); d.add("wu",-12585); d.add("xi",-12556); d.add("xia",-12359); d.add("xian",-12346); d.add("xiang",-12320); d.add("xiao",-12300); d.add("xie",-12120); d.add("xin",-12099); d.add("xing",-12089); d.add("xiong",-12074); d.add("xiu",-12067); d.add("xu",-12058); d.add("xuan",-12039); d.add("xue",-11867); d.add("xun",-11861); d.add("ya",-11847); d.add("yan",-11831); d.add("yang",-11798); d.add("yao",-11781); d.add("ye",-11604); d.add("yi",-11589); d.add("yin",-11536); d.add("ying",-11358); d.add("yo",-11340); d.add("yong",-11339); d.add("you",-11324); d.add("yu",-11303); d.add("yuan",-11097); d.add("yue",-11077); d.add("yun",-11067); d.add("za",-11055); d.add("zai",-11052); d.add("zan",-11045); d.add("zang",-11041); d.add("zao",-11038); d.add("ze",-11024); d.add("zei",-11020); d.add("zen",-11019); d.add("zeng",-11018); d.add("zha",-11014); d.add("zhai",-10838); d.add("zhan",-10832); d.add("zhang",-10815); d.add("zhao",-10800); d.add("zhe",-10790); d.add("zhen",-10780); d.add("zheng",-10764); d.add("zhi",-10587); d.add("zhong",-10544); d.add("zhou",-10533); d.add("zhu",-10519); d.add("zhua",-10331); d.add("zhuai",-10329); d.add("zhuan",-10328); d.add("zhuang",-10322); d.add("zhui",-10315); d.add("zhun",-10309); d.add("zhuo",-10307); d.add("zi",-10296); d.add("zong",-10281); d.add("zou",-10274); d.add("zu",-10270); d.add("zuan",-10262); d.add("zui",-10260); d.add("zun",-10256); d.add("zuo",-10254); /*通过查找字典得到与ascii码对应的拼音*/ function getKey(code) { if ((code>0)&&(code<160)) return String.fromCharCode(code);/* String.fromCharCode 就是把ascii码转成字符*/ else if ((code<-20319)||(code>-10247)) return ""; else for (var i=d.items.length-1;i>=0;i--) { if (d.items[i].value<=code) break; } return d.items[i].key; } /*转为大写*/ function myConvertToLower(str) { var result = "" ; for (var i=1;i<=str.length;i++) { /*执行指定语言的脚本代码: Mid(str,i,1)-指从str的第i个字符开始取长度为1的字符串 asc(char)-指获取字符的acsii码*/ execScript("ascCode=asc(mid(\"" + str + "\"," + i + ",1))", "vbscript"); result = result + getKey(ascCode); } return result.toLowerCase(); } /*转为大写*/ function myConvertToUpper(str) { var result = "" ; for (var i=1;i<=str.length;i++) { /*执行指定语言的脚本代码: Mid(str,i,1)-指从str的第i个字符开始取长度为1的字符串 asc(char)-指获取字符的acsii码*/ execScript("ascCode=asc(mid(\"" + str + "\"," + i + ",1))", "vbscript"); result = result + getKey(ascCode); } return result.toUpperCase(); } </script> |
调用代码:
/*转为大写*/ Onblur = “alert(myConvertToUpper(this.value));” /*转为小写*/ Onblur = “alert(myConvertToLower (this.value));” |
------------------
效果:汉字转拼音效果