转载自 JAVA实现汉字转换为拼音 pinyin4j/JPinyin
在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,比如说通讯录,就会要求按名字首字符发音排序,如果自己写实现这方面的功能是个很好大的工程,还好网上有公开的第三方jar支持转换,结合网上很多前辈的代码,copy了两个简单的工具方法,供参考
第一个是使用pinyin4j的jar,此jar对多音字语句的处理不太理想
package com.lovo.utils;import org.springframework.stereotype.Component;import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;/*** pinyin4j汉字转拼音工具类* @author zhiheng**/
@Component
public class ChangeToPinYin {//pinyin4j格式类private HanyuPinyinOutputFormat format = null;//拼音字符串数组private String[]pinyin;//通过构造方法进行初始化public ChangeToPinYin(){format = new HanyuPinyinOutputFormat();/** 设置需要转换的拼音格式* 以天为例* HanyuPinyinToneType.WITHOUT_TONE 转换为tian* HanyuPinyinToneType.WITH_TONE_MARK 转换为tian1* HanyuPinyinVCharType.WITH_U_UNICODE 转换为tiān* */format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);pinyin = null;}/*** 对单个字进行转换* @param pinYinStr 需转换的汉字字符串* @return 拼音字符串数组*/public String getCharPinYin(char pinYinStr){try {//执行转换pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);} catch (BadHanyuPinyinOutputFormatCombination e){// TODO Auto-generated catch blocke.printStackTrace();}//pinyin4j规则,当转换的符串不是汉字,就返回nullif(pinyin == null){return null;}//多音字会返回一个多音字拼音的数组,pinyiin4j并不能有效判断该字的读音return pinyin[0];}/*** 对单个字进行转换* @param pinYinStr* @return*/public String getStringPinYin(String pinYinStr){StringBuffer sb = new StringBuffer();String tempStr = null;//循环字符串for(int i = 0; i<pinYinStr.length(); i++){tempStr = this.getCharPinYin(pinYinStr.charAt(i));if(tempStr == null){//非汉字直接拼接sb.append(pinYinStr.charAt(i));}else{sb.append(tempStr);}}return sb.toString();}
}
测试
import javax.annotation.Resource;import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.lovo.utils.ChangeToPinYin;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class ToPinYinTest {@Resourceprivate ChangeToPinYin changeToPinYin;@Testpublic void changePinYinTest(){String str = "你在做什么?what are you nong sa lie?";System.out.println(changeToPinYin.getStringPinYin(str));}@Ignorepublic void changechar(){char c = '你';System.out.println(changeToPinYin.getCharPinYin(c));}}
测试结果
第二个方法使用JPinyin,说是在pinyin4j的jar上进行了优化,可以实现汉字转换为拼音,并自动识别常用多音字,还支持简体转换为繁体,检查是否为简体,是否为繁体,是否为中文字符等功能,下面一段代码简单列举了下汉字转换拼音及简体转换繁体
package com.lovo.utils;import opensource.jpinyin.ChineseHelper;
import opensource.jpinyin.PinyinFormat;
import opensource.jpinyin.PinyinHelper;import org.springframework.stereotype.Component;@Component
public class ChangeToPinYinJP {/*** 转换为有声调的拼音字符串* @param pinYinStr 汉字* @return 有声调的拼音字符串*/public String changeToMarkPinYin(String pinYinStr){String tempStr = null;try {tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITH_TONE_MARK);} catch (Exception e){e.printStackTrace();}return tempStr;}/*** 转换为数字声调字符串* @param pinYinStr 需转换的汉字* @return 转换完成的拼音字符串*/public String changeToNumberPinYin(String pinYinStr){String tempStr = null;try {tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITH_TONE_NUMBER);} catch (Exception e) {e.printStackTrace();}return tempStr;}/*** 转换为不带音调的拼音字符串* @param pinYinStr 需转换的汉字* @return 拼音字符串*/public String changeToTonePinYin(String pinYinStr){String tempStr = null;try {tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITHOUT_TONE);} catch (Exception e){e.printStackTrace();}return tempStr;}/*** 转换为每个汉字对应拼音首字母字符串* @param pinYinStr 需转换的汉字* @return 拼音字符串*/public String changeToGetShortPinYin(String pinYinStr){String tempStr = null;try {tempStr = PinyinHelper.getShortPinyin(pinYinStr);} catch (Exception e) {e.printStackTrace();}return tempStr;}/*** 检查汉字是否为多音字* @param pinYinStr 需检查的汉字* @return true 多音字,false 不是多音字*/public boolean checkPinYin(char pinYinStr){boolean check = false;try{check = PinyinHelper.hasMultiPinyin(pinYinStr);} catch (Exception e) {e.printStackTrace();}return check;}/*** 简体转换为繁体* @param pinYinStr* @return*/public String changeToTraditional(String pinYinStr){String tempStr = null;try {tempStr = ChineseHelper.convertToTraditionalChinese(pinYinStr);} catch (Exception e) {e.printStackTrace();}return tempStr;}/*** 繁体转换为简体* @param pinYinSt* @return*/public String changeToSimplified(String pinYinSt){String tempStr = null;try {tempStr = ChineseHelper.convertToSimplifiedChinese(pinYinSt);} catch (Exception e) {e.printStackTrace();}return tempStr;}// public static void main(String[] args) {
// String str = "重慶 most input";
// ChangeToPinYinJP jp = new ChangeToPinYinJP();
// System.out.println(jp.changeToSimplified(str));
// System.out.println(jp.checkPinYin('重'));
// }
}
拼音转换jar还有很多其他的功能,对项目实际是很有帮助的,这里只是简单的介绍了下最基本的功能,有兴趣的可以自行去了解。