码迷,mamicode.com
首页 > 其他好文 > 详细

pinyin4j:拼音与汉字的转换实例

时间:2015-08-28 19:57:04      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:java   pinyin   pinyin4j   中文   拼音   

Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。


官网: http://pinyin4j.sourceforge.net/

有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,通常都是用拼音进行查询的。比如要查询“曹孟德”,就可以输入“cmd”,即“曹孟德”三个汉字的拼音“caomengde”各字的首字母。但是怎样才能将“曹孟德”翻译成“caomengde”呢?很简单的办法就是建立一个大的对照表(比如用关联容器Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但这样的做法,需要维护好一个比较大的对照表,同时一个汉字可能有多个发音,也就是说Map这样的容器时不行的,因为其<key,value>必须是一一对应的。在C++中可以用STL里面的multimap来解决这个问题,但Java中没有类似multimap这样的东西,除非自己实现一个。

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

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

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

+ 同时支持简体中文、繁体中文转换为拼音


参考文字:
http://blog.csdn.net/pathuang68/article/details/6692882


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.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class Pinyin4jDemo1 {
	
	 public static void main(String[] args) {
		System.out.println( covertCnNameToPinyin("2222燕22ww"));
		System.out.println( covertCnNameToPinyin("燕燕燕燕燕燕燕燕","?"));
		System.out.println(covertCnStringToPinyin("2222燕22ww燕燕**燕燕"));
	 }

	/**
	 * 转换字符串中汉字为拼音,除汉字外的原样输出
	 * @param cnName
	 */
	public static String covertCnNameToPinyin(String cnName){
		
		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
		outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
		outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		
		String ret="";
		if(cnName != null && cnName.length()>0){
			  
			  for(int i = 0 ;i<cnName.length();i++){
				      String[] pinyinArray = null;
		              try
		              {
		                   char idxcnNameChar = cnName.charAt(i);
		            	   pinyinArray = PinyinHelper.toHanyuPinyinStringArray(idxcnNameChar, outputFormat);
		            	   if(pinyinArray == null){
		            	       pinyinArray = new String[]{String.valueOf(idxcnNameChar)};
		            	       String outputString = concatPinyinStringArray(pinyinArray);
                               ret = ret + outputString;
		            	   }else{
		            	       String outputString = concatPinyinStringArray(pinyinArray);
		                       if(i==0)ret = outputString+" ";
		                       else ret = ret + outputString;
		            	   }
		              } catch (BadHanyuPinyinOutputFormatCombination e1)
		              {
		                  e1.printStackTrace();
		              }         
			  }
             
		} 
		return ret;	
    }
	/**
     * 转换字符串中汉字为拼音,除汉字外的原样输出,可添加分隔符
     * @param cnName
     */
    public static String covertCnNameToPinyin(String cnName,String delimiter){
        
        HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
        outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
        outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        
        
        String ret="";
        if(cnName != null && cnName.length()>0){
              
              for(int i = 0 ;i<cnName.length();i++){
                      String[] pinyinArray = null;
                      try
                      {
                           char idxcnNameChar = cnName.charAt(i);
                           pinyinArray = PinyinHelper.toHanyuPinyinStringArray(idxcnNameChar, outputFormat);
                           if(pinyinArray == null){
                               pinyinArray = new String[]{String.valueOf(idxcnNameChar)};
                               String outputString = concatPinyinStringArray(pinyinArray);
                               ret = ret + outputString;
                           }else{
                               String outputString = concatPinyinStringArray(pinyinArray);
                               if(i==0)ret = outputString+delimiter;
                               else ret = ret + outputString;
                           }
                      } catch (BadHanyuPinyinOutputFormatCombination e1)
                      {
                          e1.printStackTrace();
                      }
                      
              }
             
            
        }
         
        return ret;
        
    }
	/**
	 * 转换汉字为拼音,非汉字的字符清除
	 * @param cnName
	 */
	public static String covertCnStringToPinyin(String cnName){
		
		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
		outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
		outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		
		
		String ret="";
		if(cnName != null && cnName.length()>0){
			  
			  for(int i = 0 ;i<cnName.length();i++){
				      String[] pinyinArray = null;
		              try
		              {
		            	   pinyinArray = PinyinHelper.toHanyuPinyinStringArray(cnName.charAt(i), outputFormat);
		              } catch (BadHanyuPinyinOutputFormatCombination e1)
		              {
		                  e1.printStackTrace();
		              }
		              String outputString = concatPinyinStringArray(pinyinArray);
		              
		              
		             ret = ret + outputString;
			  }
             
			
		}
		 
		return ret;
		
    }
	
	@SuppressWarnings("unused")
	private static String concatPinyinStringArray(String[] pinyinArray)
     {
         StringBuffer pinyinStrBuf = new StringBuffer();

         if ((null != pinyinArray) && (pinyinArray.length > 0))
         {
             for (int i = 0; i < pinyinArray.length; i++)
             {
                 pinyinStrBuf.append(pinyinArray[i]);
                 break;
                // pinyinStrBuf.append(System.getProperty("line.separator"));
             }
         }
         String outputString = pinyinStrBuf.toString();
         
         return outputString;
     }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

pinyin4j:拼音与汉字的转换实例

标签:java   pinyin   pinyin4j   中文   拼音   

原文地址:http://blog.csdn.net/sinat_26342009/article/details/48055135

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!