1. 程式人生 > >JAVA實現漢字轉換為拼音 pinyin4j/JPinyin

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 block
            e.printStackTrace();
        }

        //pinyin4j規則,當轉換的符串不是漢字,就返回null
        if(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 {

    @Resource
    private ChangeToPinYin changeToPinYin;

    @Test
    public void changePinYinTest(){
        String str = "你在做什麼?what are you nong sa lie?";

        System.out.println(changeToPinYin.getStringPinYin(str));
    }

    @Ignore
    public void changechar(){
        char c = '你';
        System.out.println(changeToPinYin.getCharPinYin(c));
    }


}

測試結果

第二個方法使用JPinyin,說是在pinyin4j的jar上進行了優化,可以實現漢字轉換為拼音,並自動識別常用多音字,還支援簡體轉換為繁體,檢查是否為簡體,是否為繁體,是否為中文字元等功能,下面一段程式碼簡單列舉了下漢字轉換拼音及簡體轉換繁體

第二個方法使用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('重'));
//  }
}