1. 程式人生 > >探索PinYin4j.jar將漢字轉換為拼音的基本用法

探索PinYin4j.jar將漢字轉換為拼音的基本用法

將漢字轉換為拼音在Android開發中是個很常見的問題。例如:在Android手機應用開發中,要查詢聯絡人的姓名,通常都是用拼音進行查詢的。
Pinyin4j是一個功能強悍的漢語拼音工具包,是sourceforge.net上的一個開源專案。
主要的功能有:
- 支援同一漢字有多個發音
- 支援拼音的格式化輸出,比如第幾聲之類的
- 支援簡體中文、繁體中文轉換為拼音
首先,在Android Studio中的使用應該將pinyin4j的包放入到libs資料夾下,然後在需要使用到pinyin4j時就在類中import要使用的相應類即可。
這裡寫圖片描述
檢查在build.gradle中是否已經匯入PinYin4j.jar的存放路徑
這裡寫圖片描述


1.基本用法(單個漢字轉拼音):
PinyinHelper類中的靜態方法toHanyuPinyinStringArray返回的資料型別是一個String陣列,它用來接收一個漢字的多個發音,如果toHanyuPinyinStringArray中的引數不是漢字,那麼它會返回null。

String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray('行');
        for (int i = 0; i < pinyinArray.length; ++i)
        {
            Log.d("TAG", pinyinArray[i]);
        }

結果輸出:
這裡寫圖片描述
可以看到“行”字有這麼5種發音,後面的數字代表第幾聲。
2.格式支援
Pinyin4j支援拼音輸出的格式化,比如,“行”字出了像前面輸出“xing2”,也可以輸出為“xing”或者“xí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 badHanyuPinyinOutputFormatCombination) { badHanyuPinyinOutputFormatCombination.printStackTrace(); } for (int i = 0; i < pinyinArray.length; ++i) { Log.d("TAG", pinyinArray[i]); }

效果圖如下:
這裡寫圖片描述
其中使用HanyuPinyinOutputFormat來格式化返回拼音的格式還有例如以下幾種:
- WITH_V:用v表示ü (nv)
- WITH_U_AND_COLON:用”u:”表示ü (nu:)
- WITH_U_UNICODE:直接用ü (nü)
–>使用:format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
- UPPERCASE:大寫 (XING)
- LOWERCASE:小寫 (xing)
–>使用:format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
- WITHOUT_TONE:無音標 (xing)
- WITH_TONE_NUMBER:1-4數字表示英標 (xing2)
- WITH_TONE_MARK:直接用音標符
–>使用:format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
雖然pinyin4j很好用,但是還是有侷限的。以上程式碼只能獲取單個漢字的拼音,但是不能獲取一個包含多音字的詞的拼音。例如“重慶”,無法判斷到底是“chongqing”還是“zhongqing”,pinyin4j不能通過上下文來判斷多音字的讀音。
  所以,在獲取一個包含多音字的詞語的讀音,可以返回一個列表,正確的讀音只能是人工判斷選擇。
3.示例程式碼

package com.adan.pinyindome;

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;

/**
 * @author: xiaolijuan
 * @description:
 * @projectName: PinyinDome
 * @date: 2016-02-18
 * @time: 10:13
 */
public class PinyinUtils {

    /**
     * 獲得漢語拼音首字母
     *
     * @param chines 漢字
     * @return
     */
    public static String getAlpha(String chines) {
        String pinyinName = "";
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
            if (nameChar[i] > 128) {
                try {
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(
                            nameChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pinyinName += nameChar[i];
            }
        }
        return pinyinName;
    }

    /**
     * 將字串中的中文轉化為拼音,英文字元不變
     *
     * @param inputString 漢字
     * @return
     */
    public static String getPingYin(String inputString) {
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        format.setVCharType(HanyuPinyinVCharType.WITH_V);
        String output = "";
        if (inputString != null && inputString.length() > 0
                && !"null".equals(inputString)) {
            char[] input = inputString.trim().toCharArray();
            try {
                for (int i = 0; i < input.length; i++) {
                    if (java.lang.Character.toString(input[i]).matches(
                            "[\\u4E00-\\u9FA5]+")) {
                        String[] temp = PinyinHelper.toHanyuPinyinStringArray(
                                input[i], format);
                        output += temp[0];
                    } else
                        output += java.lang.Character.toString(input[i]);
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }
        } else {
            return "*";
        }
        return output;
    }

    /**
     * 漢字轉換位漢語拼音首字母,英文字元不變
     *
     * @param chines 漢字
     * @return 拼音
     */
    public static String converterToFirstSpell(String chines) {
        String pinyinName = "";
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
            if (nameChar[i] > 128) {
                try {
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(
                            nameChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pinyinName += nameChar[i];
            }
        }
        return pinyinName;
    }

}

在實際開發中如果我們要將一段文字中的漢字全部轉換成不帶音調的拼音輸出,而這段文字中又可能包含阿拉伯數字、英文、標點符號等等。如果完全靠自己寫程式碼進行轉換,那是非常麻煩的,其中一個首先就要區別,這段文字中那些是漢字,那些是非漢字。有了Pinyin4j,這個問題就不再困難了

String strs = PinyinUtils.getPingYin("新年好!Hello,新年大家都過得開心吧?哈哈,我是做Android開發噠,what's this?");
        TextView textView = (TextView) findViewById(R.id.text);
        textView.setText(strs);
        Log.d("TAG", strs);

結果輸出:
xinnianhao!Hello,xinniandajiadouguodekaixinba?haha,woshizuoAndroidkaifada,what’s this?
Dome下載
下載pinyin4j-2.5.0.jar