中文转换为完整拼音算法原理分析

最近由于项目需要,对简体中文转拼音的算法作了一些了解,然而在google找到的大多是获得简体中文拼音首字母的算法,好不容易让我找到了一个sunrise.spell的类,专门用于中文转完整拼音,觉得的确做得不错,于是对它的算法作了一些分析,总的来说觉得还是比较简单的,拿出来与大家分享。

我们先来学习一些准备知识。GB2312编码对于我们中国人是再熟悉不过了,我先简单的分析一下它的编码规则。GB2312编码包括符号、数字、字母、日文、制表符等,当然最主要的部分还是中文,它采用16位编码方式,简体中文的编码范围从B0A1一直到F7FE,完整编码表可以参考http://ash.jp/code/cn/gb2312tbl.htm。如果我们把该编码的每8位用十进制来表示就是[176 | 161][247 | 254],这样对于每个中文字符,我们都可以通过两个值来表示它,如“啊”就是[176 | 161],“我”则是[206 | 210]

通过上面的方法,我们就可以通过一个二维坐标对每一个中文字进行定位,从而建立一个二维表来实现中文和拼音的对应关系。当然我们会忽略一些特殊情况,比如汉字的多音字问题。由于一个拼音可能对应多个汉字,而拼音的组合本来就不多,因此我们首先建立一个拼音音节表,代码如下,里面列出了所有可能的组合情况,该表是一维数组。

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

你可能感兴趣的:(中文转换为完整拼音算法原理分析)