JavaScript 中文转拼音实现代码 有些bug

1、问题背景:

  在做项目时候遇到一个小小的显示客户部门名称(拼音)的业务,就是在部门名称下有相应的拼音,而在现有的数据库中没有相应字段,并且部门数量比较多,添加起来比较费时,就想能否在js中实现,在页面中处理。

  2、原理描述

  程序原理很简单,网上可以找到汉字拼音的数据字典,但是由于大家都知道GB2312编码里面汉字是按拼音排序的,只要知道各个拼音为首的汉字代码,就可以计算所有汉字的拼音代码了。

  本文通过自定义用于存放汉字拼音与ascii码对应的数据字典,再通过将需要转换的汉字转为ascii码(两位),最后通过查找字典匹配即可,具体实现见代码。

  3、实现代码:

  

复制代码 代码如下:

  <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));"

  

   [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]