Java基础知识:Java汉字转拼音pinyin4j用法

汉字转换拼音在日常开发中是个很常见的问题。例如我们伟大的12306,在地名中输入“WH”,就会出现“武汉”“芜湖”“威海”等地名,输入“WUHU”就会出现“芜湖”。

  Java获取汉字的拼音,pinyin4j这个库可以很好的解决这个问题。

  下载解压,里面有个pinyin4j-2.5.0.jar,使用这个库即可。

  汉字转拼音:

  String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重');

  上面这行代码就是单个汉字转拼音了,例如“重”字,该方法返回一个String类型的数组:

  "zhong4"

  "chong2"

  “重”是一个多音字,该方法的返回数组包含这个字的所有读音的拼音。每个读音最后有个数字就是音调(第一声 第二声 第三声 第四声,这个不用解释了)。

  上面是最简单的一种获取单个汉字的方式,还可以使用HanyuPinyinOutputFormat来格式化返回拼音的格式。

  [java]

  HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();

  // UPPERCASE:大写  (ZHONG)

  // LOWERCASE:小写  (zhong)

  format.setCaseType(HanyuPinyinCaseType.LOWERCASE);

  // WITHOUT_TONE:无音标  (zhong)

  // WITH_TONE_NUMBER:1-4数字表示英标  (zhong4)

  // WITH_TONE_MARK:直接用音标符(必须WITH_U_UNICODE否则异常)  (zhòng)

  format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);

  // WITH_V:用v表示ü  (nv)

  // WITH_U_AND_COLON:用"u:"表示ü  (nu:)

  // WITH_U_UNICODE:直接用ü (nü)

  format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);

  String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重', format);

  toHanyuPinyinStringArray如果传入的字符不是汉字不能转换成拼音,那么会直接返回null。

  虽然pinyin4j很好用,但是还是有局限的。以上代码只能获取单个汉字的拼音,但是不能获取一个包含多音字的词的拼音。例如“重庆”,无法判断到底是“chongqing”还是“zhongqing”,pinyin4j不能通过上下文来判断多音字的读音。

  所以,在获取一个包含多音字的词语的读音,可以返回一个列表,正确的读音只能是人工判断选择。




pinyin4j的使用
 
pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j。
 
本人以前用AscII编码提取工具,效果不理想,现在用pinyin4j简单实现了一个。功能还不是很完美,陆续再改进吧。
 
import net.sourceforge.pinyin4j.PinyinHelper; 
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; 
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; 
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; 
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; 

import java.io.UnsupportedEncodingException; 

/** 
* 拼音工具 

* @author leizhimin 2009-7-15 15:26:21 
*/
 
public  class PinyinToolkit { 

         /** 
         * 获取汉字串拼音首字母,英文字符不变 
         * 
         * @param chinese 汉字串 
         * @return 汉语拼音首字母 
         */
 
         public  static String cn2FirstSpell(String chinese) { 
                StringBuffer pybf =  new StringBuffer(); 
                 char[] arr = chinese.toCharArray(); 
                HanyuPinyinOutputFormat defaultFormat =  new HanyuPinyinOutputFormat(); 
                defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); 
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 
                 for ( int i = 0; i < arr.length; i++) { 
                         if (arr[i] > 128) { 
                                 try { 
                                        String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat); 
                                         if (_t !=  null) { 
                                                pybf.append(_t[0].charAt(0)); 
                                        } 
                                }  catch (BadHanyuPinyinOutputFormatCombination e) { 
                                        e.printStackTrace(); 
                                } 
                        }  else { 
                                pybf.append(arr[i]); 
                        } 
                } 
                 return pybf.toString().replaceAll( "\\W", "").trim(); 
        } 

         /** 
         * 获取汉字串拼音,英文字符不变 
         * 
         * @param chinese 汉字串 
         * @return 汉语拼音 
         */
 
         public  static String cn2Spell(String chinese) { 
                StringBuffer pybf =  new StringBuffer(); 
                 char[] arr = chinese.toCharArray(); 
                HanyuPinyinOutputFormat defaultFormat =  new HanyuPinyinOutputFormat(); 
                defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); 
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 
                 for ( int i = 0; i < arr.length; i++) { 
                         if (arr[i] > 128) { 
                                 try { 
                                        pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]); 
                                }  catch (BadHanyuPinyinOutputFormatCombination e) { 
                                        e.printStackTrace(); 
                                } 
                        }  else { 
                                pybf.append(arr[i]); 
                        } 
                } 
                 return pybf.toString(); 
        } 

         public  static  void main(String[] args)  throws UnsupportedEncodingException { 
                String x =  "嘅囧誰說壞學生來勼髮視頻裆児"
                System.out.println(cn2FirstSpell(x)); 
                System.out.println(cn2Spell(x)); 
        } 
}
 
运行结果:
kjsshxsljfspde 
kaijiongshuishuohuaixueshenglaijiufashipindanger 

Process finished with exit code 0
 
在某些系统上可能有字符集的问题,需要做预处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值