Pinyin4j的用法示例

1.     有时候,需要将汉字编程对应的拼音,以方便数据的处理。

Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大:

+ 支持同一汉字有多个发音

+ 还支持拼音的格式化输出,比如第几声之类的,

+ 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。下面是其官方网址,其中提供了下载:

http://pinyin4j.sourceforge.net/

2.     基本用法:

通常情况下,只需要用到其中的PinyinHelper类中的静态方法toHanyuPinyinStringArray就可以了,比如:

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ü)  www.2cto.com
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); 
         
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重', format); 
toHanyuPinyinStringArray如果传入的字符不是汉字不能转换成拼音,那么会直接返回null。

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

 

3.    格式支持

Pinyin4j支持拼音输出的格式化,比如,“黄”可以输出为“huang”、“huang2”、“huáng”等等,下面的代码就似是输出“huáng”的示例:

HanyuPinyinOutputFormat format= new HanyuPinyinOutputFormat();

format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);

format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);

                  

String[] pinyinArray = null;

try

{

         pinyinArray = PinyinHelper.toHanyuPinyinStringArray('黄', format);

}

catch(BadHanyuPinyinOutputFormatCombination e)

{

         e.printStackTrace();

}

for(int i = 0; i < pinyinArray.length; ++i)

{

         System.out.println(pinyinArray[i]);

}

此外,还支持大小写转换、ü等等。详细情况,可以查看Pinyin4j自带的文档。

 

代码示例:

package jar2test;

import java.util.Arrays;

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;
/**"[u4E00-u9FA5]+"
 * @className:PinyingUtil.java
 * @classDescription:拼音操作工具类
 * @author huawei
 * @createTime
 */

public class Pinyin4jTest {
 /**
  * 将字符串转换成拼音数组
  *
  * @param src
  * @return
  */
 public static String[] stringToPinyin(String src) {
  return stringToPinyin(src, false, null);
 }
 /***
  * 将字符串转换成拼音数组
  * @param src
  * @param separator 分隔符
  * @return
  */
 public static String[] stringToPinyin(String src,String separator) {
  return stringToPinyin(src, true, separator);
 }
 /***
  * 简单的将各个字符数组之间连接起来
  * @param str
  * @return
  */
 public  static String stringArrayToString(String[] str){
  StringBuffer sb = new StringBuffer();
  for (int i = 0; i < str.length; i++) {
   sb.append(str[i]);
  }
  return sb.toString();
 }
 /***
  * 汉字转为拼音
  * @param hanzi
  * @return
  */
 public static String hanziToPinyin(String hanzi){
  return hanziToPinyin(hanzi," ");
 }
 /**
  * 将字符数组转换成字符串
  * @param str
  * @return
  */
 public static String charArrayToString(char[] ch) {
  return charArrayToString(ch," ");
 }
 /**
  * 取汉字的首字母(默认是大写)
  * @param src
  * @return
  */
 public static char[]  getHeadByChar(char src){
  return getHeadByChar(src,true);
 }
 /**
  * 查找字符串首字母
  * @param src
  * @return
  */
 public  static String[] getHeadByString(String src){
  return getHeadByString( src, true);
 }
 /**
  * 查找字符串首字母
  * @param src
  * @param isCapital 是否大写
  * @return
  */
 public  static String[] getHeadByString(String src,boolean isCapital){
  return getHeadByString( src, isCapital,null);
 }
 /**
  * 将字符串转换成拼音数组
  *
  * @param src
  * @param isPolyphone 是否查出多音字的所有拼音
  * @param separator 多音字拼音之间的分隔符
  * @return
  */
 private static String[] stringToPinyin(String src, boolean isPolyphone, String separator) {
  // 判断字符串是否为空
  if ("".equals(src) || null == src) {
   return null;
  }
  char[] srcChar = src.toCharArray();
  int srcCount = srcChar.length;
  String[] srcStr = new String[srcCount];
  for (int i = 0; i < srcCount; i++) {
   srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);
  }
  return srcStr;
 }
 /***
  * 将单个字符转换成拼音
  * @param src
  * @param isPolyphone
  * @param separator
  * @return
  */
 private static String charToPinyin(char src, boolean isPolyphone, String separator) {
  // 创建汉语拼音处理类
  HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  // 输出设置,大小写,音标方式
  defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  StringBuffer tempPinying = new StringBuffer();
  // 如果是中文
  if (src > 128) {
   try {
    // 转换得出结果
    String[] strs = PinyinHelper.toHanyuPinyinStringArray(src, defaultFormat);
    // 是否查出多音字,默认是查出多音字的第一个字符
    if (isPolyphone && null != separator) {
     for (int i = 0; i < strs.length; i++) {
      tempPinying.append(strs[i]);
      if (strs.length != (i + 1)) {
       tempPinying.append(separator);//多音字之间用特殊符号间隔起来
      }
     }
    } else {
     tempPinying.append(strs[0]);
    }

   } catch (BadHanyuPinyinOutputFormatCombination e) {
    e.printStackTrace();
   }
  } else {
   tempPinying.append(src);
  }
  return tempPinying.toString();
 }
 /***
  * 将汉字转换成拼音
  * @param hanzi
  * @param separator
  * @return
  */
 @SuppressWarnings("deprecation")
 private static String hanziToPinyin(String hanzi,String separator){
   // 创建汉语拼音处理类
   HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
   // 输出设置,大小写,音标方式
   defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
   defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
   
   String pinyingStr="";
   try {
    pinyingStr = PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);
   } catch (BadHanyuPinyinOutputFormatCombination e) {
    e.printStackTrace();
   } 
   return pinyingStr;
 }
 
 /**
  * 将字符数组转换成字符串
  * @param str
  * @param separator 各个字符串之间的分隔符
  * @return
  */
 private static String charArrayToString(char[] ch, String separator) {
  StringBuffer sb = new StringBuffer();
  for (int i = 0; i < ch.length; i++) {
   sb.append(ch[i]);
   if (ch.length != (i + 1)) {
    sb.append(separator);
   }
  }
  return sb.toString();
 }
 /**
  * 取汉字的首字母
  * @param src
  * @param isCapital 是否是大写
  * @return
  */
 public static char[]  getHeadByChar(char src,boolean isCapital){
  //如果不是汉字直接返回
  if (src <= 128) {
   return new char[]{src};
  }
  //获取所有的拼音
  String[] pinyingStr= PinyinHelper.toHanyuPinyinStringArray(src);
  //创建返回对象
  int polyphoneSize = pinyingStr.length;
  char [] headChars = new char[polyphoneSize];
  int i=0;
  //截取首字符
  for(String s : pinyingStr){
   char headChar = s.charAt(0);
   //首字母是否大写,默认是小写
   if(isCapital){
    headChars[i]=Character.toUpperCase(headChar);
    }else{
    headChars[i]=headChar;
    }
   i++;
  }
  return headChars;
 }
 /**
  * 查找字符串首字母
  * @param src
  * @param isCapital 是否大写
  * @param separator 分隔符
  * @return
  */
 public static String[] getHeadByString(String src, boolean isCapital, String separator){
  char[] chars= src.toCharArray();
  String[] headString = new String[chars.length];
  int i=0;
  for(char ch:chars){
   char[]chs=getHeadByChar(ch,isCapital);
   StringBuffer sb=new StringBuffer();
   if(null!=separator){
    int j=1;
    for(char ch1:chs){
     sb.append(ch1);
     if(j!=chs.length){
      sb.append(separator);
     }
     j++;
    }
   }else{
    sb.append(chs[0]);
   }
   headString[i]=sb.toString();
   i++;
  }
  return headString;
 }
 
 public static void main(String[] args) {
  String[] str1 = stringToPinyin("重捍卫主权!bi");
  System.out.println(Arrays.toString(str1));//[zhong, han, wei, zhu, quan, !, b, i]
  String[] str2 = stringToPinyin("重捍卫主权!bixude", "、");//[zhong、chong, han, wei, zhu, quan, !, b, i]
  System.out.println(Arrays.toString(str2));
  String str3 = stringArrayToString(new String[]{"重1","主"});
  System.out.println(str3);
  String str4 = hanziToPinyin("重捍卫主权!");
  System.out.println(str4);
 }
}

 

你可能感兴趣的:(Pinyin4j的用法示例)