J2ME经验总结之汉字转拼音


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

在网上参考了一些汉字转换到拼音的资料。思路应该只有以下两种。
1,查表法。这样做需要一个庞大的映射表,在j2me环境下不大合适。不过效果好,有些还支持多音字。
2,使用GB字库的映射关系。因为GB2312及其扩展GBK的汉字编码都根据区位于拼音存在映射关系。
实际上网络上的大部分文章都是根据第二种方法来实现的。

我也是采用这种方法,因为它基本上可以利用GB2312字库,直接映射成拼音。
如果遇到不支持GB2312的手机,请参考上一篇文章。
http://blog.csdn.net/hunhun1981/archive/2007/10/26/1845576.aspx

首先来介绍下原始的代码,由于这个代码在网上存在多个版本,并不知道原始作者是谁。
再次鄙视哪些剽窃人家东西不留名的人。
http://hibernate.blogdriver.com/hibernate/1036902.html
或者各位可以在百度中搜索“java 中文 拼音”,即可找到很多帖子,基本全是这份代码。

以下是一个重要片段。

      /**
     * 获得单个汉字的Ascii.
     * 
@param  cn char
     * 汉字字符
     * 
@return  int
     * 错误返回 0,否则返回ascii
     
*/
    
public   static   int  getCnAscii( char  cn) {
        
byte [] bytes  =  (String.valueOf(cn)).getBytes();
        
if  (bytes  ==   null   ||  bytes.length  >   2   ||  bytes.length  <=   0 ) {  // 错误
             return   0 ;
        }
        
if  (bytes.length  ==   1 ) {  // 英文字符
             return  bytes[ 0 ];
        }
        
if  (bytes.length  ==   2 ) {  // 中文字符
             int  hightByte  =   256   +  bytes[ 0 ];
            
int  lowByte  =   256   +  bytes[ 1 ];
            
int  ascii  =  ( 256   *  hightByte  +  lowByte)  -   256   *   256 ;
            
// System.out.println("ASCII=" + ascii);
             return  ascii;
        }
        
return   0 // 错误
    }

这个方法中有一个片段大家需要注意,“(String.valueOf(cn)).getBytes();”这一句。
这里获得的应该是GBK编码,可不是unicode。
unicode是无法使用现在的方法来获取拼音的,只能用查表法,弄一张对于j2me来说很庞大的映射表。


下面详细介绍一下我改进后的方法。并且对原始代码的作者表示感谢,虽然不知道他是谁。 

     public   class  HGB2PINYIN {

        
private  String[] name  =  {  " 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   int [] 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  String getPinyin(String gb2312) {
            
if  ( null   ==  gb2312  ||   "" .equals(gb2312.trim())) {
                
return  gb2312;
            }
            
char [] chars  =  gb2312.toCharArray();
            StringBuffer retuBuf 
=   new  StringBuffer();
            
for  ( int  i  =   0 , Len  =  chars.length; i  <  Len; i ++ ) {
                retuBuf.append(getPinyin(chars[i]));
            } 
//  end of for
             return  retuBuf.toString();
        }

        
public  String getPinyin( char  gb2312) {
            
int  ascii  =  getCnAscii(gb2312);
            
if  (ascii  ==   0 ) {  //  取ascii时出错
                 return  String.valueOf(gb2312);
            } 
else  {
                String spell 
=  getSpellByAscii(ascii);
                
if  (spell  ==   null ) {
                    
return  String.valueOf(gb2312);
                } 
else  {
                    
return  spell;
                } 
//  end of if spell == null
            }
        }

        
private   int  getCnAscii( char  cn) {
            
byte [] bytes  =   null ;
            
try  {
                bytes 
=  (String.valueOf(cn)).getBytes( " GB2312 " );
            } 
catch  (Exception e) {
                e.printStackTrace();
            }
            
if  (bytes  ==   null   ||  bytes.length  >   2   ||  bytes.length  <=   0 ) {
                
return   0 ;
            }
            
if  (bytes.length  ==   1 ) {
                
return  bytes[ 0 ];
            } 
else  {
                
int  hightByte  =   256   +  bytes[ 0 ];
                
int  lowByte  =   256   +  bytes[ 1 ];
                
int  ascii  =  ( 256   *  hightByte  +  lowByte)  -   256   *   256 ;
                
return  ascii;
            }
        }

        
private  String getSpellByAscii( int  ascii) {
            
if  (ascii  >   0   &&  ascii  <   160 ) {  //  单字符
                 return  String.valueOf(( char ) ascii);
            }
            
if  (ascii  <   - 20319   ||  ascii  >   - 10247 ) {  //  不知道的字符
                 return   " ? " ;
            }
            
int  ind;
            
for  (ind  =   0 ; ind  <  code.length; ind ++ ) {
                
if  (ascii  >  code[ind]) {
                    
break ;
                }
            }
            
return  name[ind];
        }
    }

 

首先我去除了比较多余的LinkedHashMap,同时解决了原始代码中查询时比较弱的查询方式。直接通过数组索引做判断(参考getSpellByAscii函数,如果有兴趣,各位可以把循环判断区间改为二分法,效果会好很多,毕竟是395的数组,要找到区间最坏情况下要遍历整个数组并判断395次)。

如果手机不支持GB2312,那么可以参考我以前的文章,修改getCnAscii函数,使用我提供的库将编码转换位GB2312。

感谢各位的阅读,转贴请注明出处。
欢迎有兴趣的朋友多多指点交流经验。

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值