汉字转拼音c#版


作者:hunhun1981
出自:http://blog.csdn.net/hunhun1981/

前两天无聊,把j2me的代码(gb2312转拼音) 移植到了c#,其实特别简单,就是换换东西。

此外,跟大家介绍一个很强大的工具:Java Language Conversion Assistant。使用它可以轻松的将java类库转换为c#工程。特别是算法型的代码,转换效果非常好。

我曾经把一个qrcode,dm混合编码的算法用它进行转换,喝杯茶的功夫,全部转换完成。当然了,它会提示你一些需要手动修改的地方,然后我用了10分钟,就修改完代码,可以正常执行了。有兴趣的朋友自己找找,就在vs.net中有集成的。

好了,帖代码了,感谢大家的支持。

 

     class  GB2PY
    {
        
private   static   int [] FIRST_TABLE  =  {  45217 45253 45761 46318 46826 ,
                
47010 47297 47614 47614 48119 49062 49324 49896 50371 ,
                
50614 50622 50906 51387 51446 52218 52218 52218 52698 ,
                
52980 53689 54481 55289  };

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

        
private   static   int [] ALL_CODE  =  {  - 10254 - 10256 - 10260 - 10262 ,
                
- 10270 - 10274 - 10281 - 10296 - 10307 - 10309 - 10315 - 10322 ,
                
- 10328 - 10329 - 10331 - 10519 - 10533 - 10544 - 10587 - 10764 ,
                
- 10780 - 10790 - 10800 - 10815 - 10832 - 10838 - 11014 - 11018 ,
                
- 11019 - 11020 - 11024 - 11038 - 11041 - 11045 - 11052 - 11055 ,
                
- 11067 - 11077 - 11097 - 11303 - 11324 - 11339 - 11340 - 11358 ,
                
- 11536 - 11589 - 11604 - 11781 - 11798 - 11831 - 11847 - 11861 ,
                
- 11867 - 12039 - 12058 - 12067 - 12074 - 12089 - 12099 - 12120 ,
                
- 12300 - 12320 - 12346 - 12359 - 12556 - 12585 - 12594 - 12597 ,
                
- 12607 - 12802 - 12812 - 12829 - 12831 - 12838 - 12849 - 12852 ,
                
- 12858 - 12860 - 12871 - 12875 - 12888 - 13060 - 13063 - 13068 ,
                
- 13076 - 13091 - 13095 - 13096 - 13107 - 13120 - 13138 - 13147 ,
                
- 13318 - 13326 - 13329 - 13340 - 13343 - 13356 - 13359 - 13367 ,
                
- 13383 - 13387 - 13391 - 13395 - 13398 - 13400 - 13404 - 13406 ,
                
- 13601 - 13611 - 13658 - 13831 - 13847 - 13859 - 13870 - 13878 ,
                
- 13894 - 13896 - 13905 - 13906 - 13907 - 13910 - 13914 - 13917 ,
                
- 14083 - 14087 - 14090 - 14092 - 14094 - 14097 - 14099 - 14109 ,
                
- 14112 - 14122 - 14123 - 14125 - 14135 - 14137 - 14140 - 14145 ,
                
- 14149 - 14151 - 14159 - 14170 - 14345 - 14353 - 14355 - 14368 ,
                
- 14379 - 14384 - 14399 - 14407 - 14429 - 14594 - 14630 - 14645 ,
                
- 14654 - 14663 - 14668 - 14670 - 14674 - 14678 - 14857 - 14871 ,
                
- 14873 - 14882 - 14889 - 14894 - 14902 - 14908 - 14914 - 14921 ,
                
- 14922 - 14926 - 14928 - 14929 - 14930 - 14933 - 14937 - 14941 ,
                
- 15109 - 15110 - 15117 - 15119 - 15121 - 15128 - 15139 - 15140 ,
                
- 15141 - 15143 - 15144 - 15149 - 15150 - 15153 - 15158 - 15165 ,
                
- 15180 - 15183 - 15362 - 15363 - 15369 - 15375 - 15377 - 15385 ,
                
- 15394 - 15408 - 15416 - 15419 - 15435 - 15436 - 15448 - 15454 ,
                
- 15625 - 15631 - 15640 - 15652 - 15659 - 15661 - 15667 - 15681 ,
                
- 15701 - 15707 - 15878 - 15889 - 15903 - 15915 - 15920 - 15933 ,
                
- 15944 - 15958 - 15959 - 16155 - 16158 - 16169 - 16171 - 16180 ,
                
- 16187 - 16202 - 16205 - 16212 - 16216 - 16220 - 16393 - 16401 ,
                
- 16403 - 16407 - 16412 - 16419 - 16423 - 16427 - 16429 - 16433 ,
                
- 16448 - 16452 - 16459 - 16465 - 16470 - 16474 - 16647 - 16657 ,
                
- 16664 - 16689 - 16706 - 16708 - 16733 - 16915 - 16942 - 16970 ,
                
- 16983 - 17185 - 17202 - 17417 - 17427 - 17433 - 17454 - 17468 ,
                
- 17482 - 17487 - 17496 - 17676 - 17683 - 17692 - 17697 - 17701 ,
                
- 17703 - 17721 - 17730 - 17733 - 17752 - 17759 - 17922 - 17928 ,
                
- 17931 - 17947 - 17950 - 17961 - 17964 - 17970 - 17988 - 17997 ,
                
- 18012 - 18181 - 18183 - 18184 - 18201 - 18211 - 18220 - 18231 ,
                
- 18237 - 18239 - 18446 - 18447 - 18448 - 18463 - 18478 - 18490 ,
                
- 18501 - 18518 - 18526 - 18696 - 18697 - 18710 - 18722 - 18731 ,
                
- 18735 - 18741 - 18756 - 18763 - 18773 - 18774 - 18783 - 18952 ,
                
- 18961 - 18977 - 18996 - 19003 - 19006 - 19018 - 19023 - 19038 ,
                
- 19212 - 19218 - 19224 - 19227 - 19235 - 19238 - 19242 - 19243 ,
                
- 19249 - 19261 - 19263 - 19270 - 19275 - 19281 - 19288 - 19289 ,
                
- 19467 - 19479 - 19484 - 19500 - 19515 - 19525 - 19531 - 19540 ,
                
- 19715 - 19725 - 19728 - 19739 - 19741 - 19746 - 19751 - 19756 ,
                
- 19763 - 19774 - 19775 - 19784 - 19805 - 19976 - 19982 - 19986 ,
                
- 19990 - 20002 - 20026 - 20032 - 20036 - 20051 - 20230 - 20242 ,
                
- 20257 - 20265 - 20283 - 20292 - 20295 - 20304 - 20317 - 20319  };

        
public   static   string  getAllPY( string  gb2312)
        {
            
if  ( null   ==  gb2312  ||   "" .Equals(gb2312.Trim()))
            {
                
return  gb2312;
            }
            
char [] chars  =  gb2312.ToCharArray();
            StringBuilder retuBuf 
=   new  StringBuilder();
            
for  ( int  i  =   0 , Len  =  chars.Length; i  <  Len; i ++ )
            {
                retuBuf.Append(getAllPY(chars[i]));
            } 
//  end of for
             return  retuBuf.ToString();
        }

        
public   static   string  getAllPY( char  gb2312)
        {
            
int  ascii  =  getCnAscii(gb2312);
            
if  (ascii  ==   0 )
            { 
//  取ascii时出错
                 return   new   string (gb2312,  1 );
            }
            
else
            {
                
string  spell  =  getSpellByAscii(ascii);
                
if  (spell  ==   null )
                {
                    
return   new   string (gb2312,  1 );
                }
                
else
                {
                    
return  spell;
                } 
//  end of if spell == null
            }
        }

        
public   static   char  getFirstPY( char  ch)
        {
            
if  (ch  >=   0   &&  ch  <=   0x7F )
            {
                
return  ch;
            }
            
int  gb  =   0 ;

            
byte [] bytes  =  Encoding.GetEncoding( " gb2312 " ).GetBytes( new   string (ch,  1 ));
            
if  (bytes.Length  <   2 )
            {
                gb 
=  byte2Int(bytes[ 0 ]);
            }
            gb 
=  (bytes[ 0 <<   8   &   0xff00 +  (bytes[ 1 &   0xff );
            
if  (gb  <  FIRST_TABLE[ 0 ])
                
return  ch;
            
int  i;
            
for  (i  =   0 ; i  <   26 ++ i)
            {
                
if  (match(i, gb))
                    
break ;
            }
            
if  (i  >=   26 )
                
return  ch;
            
else
                
return  ( char )( 65   +  i);
        }

        
public   static   string  getFirstPY( string  src)
        {
            StringBuilder sb 
=   new  StringBuilder();
            
int  len  =  src.Length;
            
int  i;
            
for  (i  =   0 ; i  <  len; i ++ )
            {
                sb.Append(getFirstPY(src[i]));
            }
            
return  sb.ToString();
        }

        
private   static   int  getCnAscii( char  cn)
        {
            
byte [] bytes  =   null ;
            bytes 
=  Encoding.GetEncoding( " gb2312 " ).GetBytes( new   string (cn,  1 ));
            
if  (bytes  ==   null   ||  bytes.Length  >   2   ||  bytes.Length  <=   0 )
            {
                
return   0 ;
            }
            
if  (bytes.Length  ==   1 )
            {
                
return  bytes[ 0 ];
            }
            
else
            {
                
int  hightByte  =  bytes[ 0 ];
                
int  lowByte  =  bytes[ 1 ];
                
int  ascii  =  ( 256   *  hightByte  +  lowByte)  -   256   *   256 ;
                
return  ascii;
            }
        }

        
private   static   string  getSpellByAscii( int  ascii)
        {
            
if  (ascii  >   0   &&  ascii  <   160 )
            { 
//  单字符
                 return   new   string (( char )ascii,  1 );
            }
            
if  (ascii  <   - 20319   ||  ascii  >   - 10247 )
            { 
//  不知道的字符
                 return   null ;
            }
            
int  first  =   0 ;
            
int  sLast  =  ALL_CODE.Length  -   1 ;
            
int  last  =  ALL_CODE.Length  -   1 ;
            
int  mid;
            
int  temp;
            
while  ( true )
            {
                mid 
=  (first  +  last)  >>   1 ;
                
if  (ascii  ==  ALL_CODE[mid])
                {
                    
return  ALL_VALUE[mid];
                }
                
else   if  (ascii  >  ALL_CODE[mid])
                {
                    temp 
=  mid  -   1 ;
                    
if  (temp  >=   0 )
                    {
                        
if  (ascii  <  ALL_CODE[temp])
                        {
                            
return  ALL_VALUE[mid];
                        }
                        
else
                        {
                            last 
=  mid;
                        }
                    }
                    
else
                    {
                        
return  ALL_VALUE[ 0 ];
                    }
                }
                
else
                {
                    
if  (mid  +   1   <=  sLast)
                    {
                        first 
=  mid  +   1 ;
                    }
                    
else
                    {
                        
return  ALL_VALUE[sLast];
                    }
                }
            }
        }

        
private   static   bool  match( int  i,  int  gb)
        {
            
if  (gb  <  FIRST_TABLE[i])
            {
                
return   false ;
            }
            
int  j  =  i  +   1 ;
            
//  字母Z使用了两个标签
             while  (j  <   26   &&  (FIRST_TABLE[j]  ==  FIRST_TABLE[i]))
            {
                
++ j;
            }
            
if  (j  ==   26 )
                
return  gb  <=  FIRST_TABLE[j];
            
else
                
return  gb  <  FIRST_TABLE[j];
        }

        
private   static   int  byte2Int( byte  b)
        {
            
if  (b  <   0 )
            {
                
return   256   +  b;
            }
            
else
            {
                
return  b;
            }
        }

        
public   static   bool  isSpliter( char  c)
        {
            
char [] spliter  =  {  ' , ' ' ' ' ; ' ' '  };
            
foreach  ( char  cc  in  spliter)
            {
                
if  (c  ==  cc)
                {
                    
return   true ;
                }
            }
            
return   false ;
        }

        
public   static   string [] split( string  src)
        {
            
string  text  =  src.Trim();
            StringBuilder sb 
=   new  StringBuilder();
            ArrayList al 
=   new  ArrayList();
            
int  i  =   0 ;
            
// 跳过之前的分隔符
             for  (i  =   0 ; i  <  text.Length; i ++ )
            {
                
if  ( ! isSpliter(text[i]))
                {
                    
break ;
                }
            }
            
for  (; i  <  text.Length; i ++ )
            {
                
if  (isSpliter(text[i]))
                {
                    
if  (sb.Length  >   0 )
                    {
                        al.Add(sb.ToString());
                    }
                    sb 
=   new  StringBuilder();
                }
                
else
                {
                    sb.Append(text[i]);
                }
            }
            
if  (sb.Length  >   0 )
            {
                al.Add(sb.ToString());
            }
            
if  (al.Count  >   0 )
            {
                
string [] ret  =   new   string [al.Count];
                
for  (i  =   0 ; i  <  al.Count; i ++ )
                {
                    ret[i] 
=  ( string )al[i];
                }
                
return  ret;
            }
            
else
            {
                
return   null ;
            }
        }
    }

更多信息,请关注hunhun1981的专栏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值