[C#] 中文連續拼音的英文加入空白

2019-12-06

最近工作上接到一個需求 假設 客戶給了一個字串 xiangubao  這是拼音,到底是鮮菇包(xian gu bao),還是西安古堡(xi an gi bqo),因為有時候對方忘記切換輸入法,導致中間連續打拼音,但是我們要試圖知道他在說啥。



首先,這問題有考慮到聲母韻母的問題,所以網路上我找到了拼音的所有列舉 ,感謝網路上面的前輩無私的奉獻
https://blog.csdn.net/pigkeli/article/details/10827825

列舉的 Code

PinYinTable = new HashSet<string>(); PinYinTable.Clear(); PinYinTable.Add("a"); PinYinTable.Add("ai"); PinYinTable.Add("an"); PinYinTable.Add("ang"); PinYinTable.Add("ao"); PinYinTable.Add("ba"); PinYinTable.Add("bai"); PinYinTable.Add("ban"); PinYinTable.Add("bang"); PinYinTable.Add("bao"); PinYinTable.Add("bei"); PinYinTable.Add("ben"); PinYinTable.Add("beng"); PinYinTable.Add("bi"); PinYinTable.Add("bian"); PinYinTable.Add("biao"); PinYinTable.Add("bie"); PinYinTable.Add("bin"); PinYinTable.Add("bing"); PinYinTable.Add("bo"); PinYinTable.Add("bu"); PinYinTable.Add("ca"); PinYinTable.Add("cai"); PinYinTable.Add("can"); PinYinTable.Add("cang"); PinYinTable.Add("cao"); PinYinTable.Add("ce"); PinYinTable.Add("ceng"); PinYinTable.Add("cha"); PinYinTable.Add("chai"); PinYinTable.Add("chan"); PinYinTable.Add("chang"); PinYinTable.Add("chao"); PinYinTable.Add("che"); PinYinTable.Add("chen"); PinYinTable.Add("cheng"); PinYinTable.Add("chi"); PinYinTable.Add("chong"); PinYinTable.Add("chou"); PinYinTable.Add("chu"); PinYinTable.Add("chuai"); PinYinTable.Add("chuan"); PinYinTable.Add("chuang"); PinYinTable.Add("chui"); PinYinTable.Add("chun"); PinYinTable.Add("chuo"); PinYinTable.Add("ci"); PinYinTable.Add("cong"); PinYinTable.Add("cou"); PinYinTable.Add("cu"); PinYinTable.Add("cuan"); PinYinTable.Add("cui"); PinYinTable.Add("cun"); PinYinTable.Add("cuo"); PinYinTable.Add("da"); PinYinTable.Add("dai"); PinYinTable.Add("dan"); PinYinTable.Add("dang"); PinYinTable.Add("dao"); PinYinTable.Add("de"); PinYinTable.Add("deng"); PinYinTable.Add("di"); PinYinTable.Add("dian"); PinYinTable.Add("diao"); PinYinTable.Add("die"); PinYinTable.Add("ding"); PinYinTable.Add("diu"); PinYinTable.Add("dong"); PinYinTable.Add("dou"); PinYinTable.Add("du"); PinYinTable.Add("duan"); PinYinTable.Add("dui"); PinYinTable.Add("dun"); PinYinTable.Add("duo"); PinYinTable.Add("e"); PinYinTable.Add("en"); PinYinTable.Add("er"); PinYinTable.Add("fa"); PinYinTable.Add("fan"); PinYinTable.Add("fang"); PinYinTable.Add("fei"); PinYinTable.Add("fen"); PinYinTable.Add("feng"); PinYinTable.Add("fo"); PinYinTable.Add("fou"); PinYinTable.Add("fu"); PinYinTable.Add("ga"); PinYinTable.Add("gai"); PinYinTable.Add("gan"); PinYinTable.Add("gang"); PinYinTable.Add("gao"); PinYinTable.Add("ge"); PinYinTable.Add("gei"); PinYinTable.Add("gen"); PinYinTable.Add("geng"); PinYinTable.Add("gong"); PinYinTable.Add("gou"); PinYinTable.Add("gu"); PinYinTable.Add("gua"); PinYinTable.Add("guai"); PinYinTable.Add("guan"); PinYinTable.Add("guang"); PinYinTable.Add("gui"); PinYinTable.Add("gun"); PinYinTable.Add("guo"); PinYinTable.Add("ha"); PinYinTable.Add("hai"); PinYinTable.Add("han"); PinYinTable.Add("hang"); PinYinTable.Add("hao"); PinYinTable.Add("he"); PinYinTable.Add("hei"); PinYinTable.Add("hen"); PinYinTable.Add("heng"); PinYinTable.Add("hong"); PinYinTable.Add("hou"); PinYinTable.Add("hu"); PinYinTable.Add("hua"); PinYinTable.Add("huai"); PinYinTable.Add("huan"); PinYinTable.Add("huang"); PinYinTable.Add("hui"); PinYinTable.Add("hun"); PinYinTable.Add("huo"); PinYinTable.Add("ji"); PinYinTable.Add("jia"); PinYinTable.Add("jian"); PinYinTable.Add("jiang"); PinYinTable.Add("jiao"); PinYinTable.Add("jie"); PinYinTable.Add("jin"); PinYinTable.Add("jing"); PinYinTable.Add("jiong"); PinYinTable.Add("jiu"); PinYinTable.Add("ju"); PinYinTable.Add("juan"); PinYinTable.Add("jue"); PinYinTable.Add("jun"); PinYinTable.Add("ka"); PinYinTable.Add("kai"); PinYinTable.Add("kan"); PinYinTable.Add("kang"); PinYinTable.Add("kao"); PinYinTable.Add("ke"); PinYinTable.Add("ken"); PinYinTable.Add("keng"); PinYinTable.Add("kong"); PinYinTable.Add("kou"); PinYinTable.Add("ku"); PinYinTable.Add("kua"); PinYinTable.Add("kuai"); PinYinTable.Add("kuan"); PinYinTable.Add("kuang"); PinYinTable.Add("kui"); PinYinTable.Add("kun"); PinYinTable.Add("kuo"); PinYinTable.Add("la"); PinYinTable.Add("lai"); PinYinTable.Add("lan"); PinYinTable.Add("lang"); PinYinTable.Add("lao"); PinYinTable.Add("le"); PinYinTable.Add("lei"); PinYinTable.Add("leng"); PinYinTable.Add("li"); PinYinTable.Add("lia"); PinYinTable.Add("lian"); PinYinTable.Add("liang"); PinYinTable.Add("liao"); PinYinTable.Add("lie"); PinYinTable.Add("lin"); PinYinTable.Add("ling"); PinYinTable.Add("liu"); PinYinTable.Add("long"); PinYinTable.Add("lou"); PinYinTable.Add("lu"); PinYinTable.Add("lv"); PinYinTable.Add("luan"); PinYinTable.Add("lue"); PinYinTable.Add("lun"); PinYinTable.Add("luo"); PinYinTable.Add("ma"); PinYinTable.Add("mai"); PinYinTable.Add("man"); PinYinTable.Add("mang"); PinYinTable.Add("mao"); PinYinTable.Add("me"); PinYinTable.Add("mei"); PinYinTable.Add("men"); PinYinTable.Add("meng"); PinYinTable.Add("mi"); PinYinTable.Add("mian"); PinYinTable.Add("miao"); PinYinTable.Add("mie"); PinYinTable.Add("min"); PinYinTable.Add("ming"); PinYinTable.Add("miu"); PinYinTable.Add("mo"); PinYinTable.Add("mou"); PinYinTable.Add("mu"); PinYinTable.Add("na"); PinYinTable.Add("nai"); PinYinTable.Add("nan"); PinYinTable.Add("nang"); PinYinTable.Add("nao"); PinYinTable.Add("ne"); PinYinTable.Add("nei"); PinYinTable.Add("nen"); PinYinTable.Add("neng"); PinYinTable.Add("ni"); PinYinTable.Add("nian"); PinYinTable.Add("niang"); PinYinTable.Add("niao"); PinYinTable.Add("nie"); PinYinTable.Add("nin"); PinYinTable.Add("ning"); PinYinTable.Add("niu"); PinYinTable.Add("nong"); PinYinTable.Add("nu"); PinYinTable.Add("nv"); PinYinTable.Add("nuan"); PinYinTable.Add("nue"); PinYinTable.Add("nuo"); PinYinTable.Add("o"); PinYinTable.Add("ou"); PinYinTable.Add("pa"); PinYinTable.Add("pai"); PinYinTable.Add("pan"); PinYinTable.Add("pang"); PinYinTable.Add("pao"); PinYinTable.Add("pei"); PinYinTable.Add("pen"); PinYinTable.Add("peng"); PinYinTable.Add("pi"); PinYinTable.Add("pian"); PinYinTable.Add("piao"); PinYinTable.Add("pie"); PinYinTable.Add("pin"); PinYinTable.Add("ping"); PinYinTable.Add("po"); PinYinTable.Add("pu"); PinYinTable.Add("qi"); PinYinTable.Add("qia"); PinYinTable.Add("qian"); PinYinTable.Add("qiang"); PinYinTable.Add("qiao"); PinYinTable.Add("qie"); PinYinTable.Add("qin"); PinYinTable.Add("qing"); PinYinTable.Add("qiong"); PinYinTable.Add("qiu"); PinYinTable.Add("qu"); PinYinTable.Add("quan"); PinYinTable.Add("que"); PinYinTable.Add("qun"); PinYinTable.Add("ran"); PinYinTable.Add("rang"); PinYinTable.Add("rao"); PinYinTable.Add("re"); PinYinTable.Add("ren"); PinYinTable.Add("reng"); PinYinTable.Add("ri"); PinYinTable.Add("rong"); PinYinTable.Add("rou"); PinYinTable.Add("ru"); PinYinTable.Add("ruan"); PinYinTable.Add("rui"); PinYinTable.Add("run"); PinYinTable.Add("ruo"); PinYinTable.Add("sa"); PinYinTable.Add("sai"); PinYinTable.Add("san"); PinYinTable.Add("sang"); PinYinTable.Add("sao"); PinYinTable.Add("se"); PinYinTable.Add("sen"); PinYinTable.Add("seng"); PinYinTable.Add("sha"); PinYinTable.Add("shai"); PinYinTable.Add("shan"); PinYinTable.Add("shang"); PinYinTable.Add("shao"); PinYinTable.Add("she"); PinYinTable.Add("shen"); PinYinTable.Add("sheng"); PinYinTable.Add("shi"); PinYinTable.Add("shou"); PinYinTable.Add("shu"); PinYinTable.Add("shua"); PinYinTable.Add("shuai"); PinYinTable.Add("shuan"); PinYinTable.Add("shuang"); PinYinTable.Add("shui"); PinYinTable.Add("shun"); PinYinTable.Add("shuo"); PinYinTable.Add("si"); PinYinTable.Add("song"); PinYinTable.Add("sou"); PinYinTable.Add("su"); PinYinTable.Add("suan"); PinYinTable.Add("sui"); PinYinTable.Add("sun"); PinYinTable.Add("suo"); PinYinTable.Add("ta"); PinYinTable.Add("tai"); PinYinTable.Add("tan"); PinYinTable.Add("tang"); PinYinTable.Add("tao"); PinYinTable.Add("te"); PinYinTable.Add("teng"); PinYinTable.Add("ti"); PinYinTable.Add("tian"); PinYinTable.Add("tiao"); PinYinTable.Add("tie"); PinYinTable.Add("ting"); PinYinTable.Add("tong"); PinYinTable.Add("tou"); PinYinTable.Add("tu"); PinYinTable.Add("tuan"); PinYinTable.Add("tui"); PinYinTable.Add("tun"); PinYinTable.Add("tuo"); PinYinTable.Add("wa"); PinYinTable.Add("wai"); PinYinTable.Add("wan"); PinYinTable.Add("wang"); PinYinTable.Add("wei"); PinYinTable.Add("wen"); PinYinTable.Add("weng"); PinYinTable.Add("wo"); PinYinTable.Add("wu"); PinYinTable.Add("xi"); PinYinTable.Add("xia"); PinYinTable.Add("xian"); PinYinTable.Add("xiang"); PinYinTable.Add("xiao"); PinYinTable.Add("xie"); PinYinTable.Add("xin"); PinYinTable.Add("xing"); PinYinTable.Add("xiong"); PinYinTable.Add("xiu"); PinYinTable.Add("xu"); PinYinTable.Add("xuan"); PinYinTable.Add("xue"); PinYinTable.Add("xun"); PinYinTable.Add("ya"); PinYinTable.Add("yan"); PinYinTable.Add("yang"); PinYinTable.Add("yao"); PinYinTable.Add("ye"); PinYinTable.Add("yi"); PinYinTable.Add("yin"); PinYinTable.Add("ying"); PinYinTable.Add("yo"); PinYinTable.Add("yong"); PinYinTable.Add("you"); PinYinTable.Add("yu"); PinYinTable.Add("yuan"); PinYinTable.Add("yue"); PinYinTable.Add("yun"); PinYinTable.Add("za"); PinYinTable.Add("zai"); PinYinTable.Add("zan"); PinYinTable.Add("zang"); PinYinTable.Add("zao"); PinYinTable.Add("ze"); PinYinTable.Add("zei"); PinYinTable.Add("zen"); PinYinTable.Add("zeng"); PinYinTable.Add("zha"); PinYinTable.Add("zhai"); PinYinTable.Add("zhan"); PinYinTable.Add("zhang"); PinYinTable.Add("zhao"); PinYinTable.Add("zhe"); PinYinTable.Add("zhen"); PinYinTable.Add("zheng"); PinYinTable.Add("zhi"); PinYinTable.Add("zhong"); PinYinTable.Add("zhou"); PinYinTable.Add("zhu"); PinYinTable.Add("zhua"); PinYinTable.Add("zhuai"); PinYinTable.Add("zhuan"); PinYinTable.Add("zhuang"); PinYinTable.Add("zhui"); PinYinTable.Add("zhun"); PinYinTable.Add("zhuo"); PinYinTable.Add("zi"); PinYinTable.Add("zong"); PinYinTable.Add("zou"); PinYinTable.Add("zu"); PinYinTable.Add("zuan"); PinYinTable.Add("zui"); PinYinTable.Add("zun"); PinYinTable.Add("zuo"); PinYinTable.Add("zz");

透過 上面因為有列舉,之後就透過遞迴去把有可能跑完,當然我並沒有特別考慮效能只是想到直覺地把這寫完,如果你覺得我設計的遞迴不好,或是效能不好,可以自行再改寫

var result = new List<string>(); GetPinYin("", "xiangubao", result); foreach (var res in result) { Result +=res+"<br>"; } public void GetPinYin(string pre, string after,List<string> result) { if (string.IsNullOrEmpty(after)) { result.Add(pre); return ; } var limitLength = 6; if (after.Length <= 6) { limitLength = after.Length; } for (var i = 1; i <= limitLength; i++) { var shortS = after.Substring(0, i); if (PinYinTable.Contains(shortS)) { var pre2 = pre + " " + shortS; GetPinYin(pre2, after.Substring(i, after.Length - i),result); } } }


結果


原來答案不只有 xian gu bao , xi an gu bao  還有其他的..


當麻許的碎念筆記 2014 | Donma Hsu Design.