Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。
有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,通常都是用拼音进行查询的。比如要查询“曹孟德”,就可以输入“cmd”,即“曹孟德”三个汉字的拼音“caomengde”各字的首字母。但是怎样才能将“曹孟德”翻译成“caomengde”呢?很简单的办法就是建立一个大的对照表(比如用关联容器Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但这样的做法,需要维护好一个比较大的对照表,同时一个汉字可能有多个发音,也就是说Map这样的容器时不行的,因为其<key,value>必须是一一对应的。在C++中可以用STL里面的multimap来解决这个问题,但Java中没有类似multimap这样的东西,除非自己实现一个。
Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大:
+ 支持同一汉字有多个发音
+ 还支持拼音的格式化输出,比如第几声之类的,
+ 同时支持简体中文、繁体中文转换为拼音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; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/sinat_26342009/article/details/48055135