Java基礎知識:Java漢字轉拼音pinyin4j用法
漢字轉換拼音在日常開發中是個很常見的問題。例如我們偉大的12306,在地名中輸入“WH”,就會出現“武漢”“蕪湖”“威海”等地名,輸入“WUHU”就會出現“蕪湖”。
Java獲取漢字的拼音,pinyin4j這個庫可以很好的解決這個問題。
下載解壓,裡面有個pinyin4j-2.5.0.jar,使用這個庫即可。
漢字轉拼音:
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重');
上面這行程式碼就是單個漢字轉拼音了,例如“重”字,該方法返回一個String型別的陣列:
"zhong4"
"chong2"
“重”是一個多音字,該方法的返回陣列包含這個字的所有讀音的拼音。每個讀音最後有個數字就是音調(第一聲 第二聲 第三聲 第四聲,這個不用解釋了)。
上面是最簡單的一種獲取單個漢字的方式,還可以使用HanyuPinyinOutputFormat來格式化返回拼音的格式。
[java]
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
// UPPERCASE:大寫 (ZHONG)
// LOWERCASE:小寫 (zhong)
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
// WITHOUT_TONE:無音標 (zhong)
// WITH_TONE_NUMBER:1-4數字表示英標 (zhong4)
// WITH_TONE_MARK:直接用音標符(必須WITH_U_UNICODE否則異常) (zhòng)
format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
// WITH_V:用v表示ü (nv)
// WITH_U_AND_COLON:用"u:"表示ü (nu:)
// WITH_U_UNICODE:直接用ü (nü)
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重', format);
toHanyuPinyinStringArray如果傳入的字元不是漢字不能轉換成拼音,那麼會直接返回null。
雖然pinyin4j很好用,但是還是有侷限的。以上程式碼只能獲取單個漢字的拼音,但是不能獲取一個包含多音字的詞的拼音。例如“重慶”,無法判斷到底是“chongqing”還是“zhongqing”,pinyin4j不能通過上下文來判斷多音字的讀音。
所以,在獲取一個包含多音字的詞語的讀音,可以返回一個列表,正確的讀音只能是人工判斷選擇。
pinyin4j的使用 pinyin4j是一個功能強悍的漢語拼音工具包,主要是從漢語獲取各種格式和需求的拼音,功能強悍,下面看看如何使用pinyin4j。 本人以前用AscII編碼提取工具,效果不理想,現在用pinyin4j簡單實現了一個。功能還不是很完美,陸續再改進吧。 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.exception.BadHanyuPinyinOutputFormatCombination;
import java.io.UnsupportedEncodingException;
/**
* 拼音工具
*
* @author leizhimin 2009-7-15 15:26:21
*/
public class PinyinToolkit {
/**
* 獲取漢字串拼音首字母,英文字元不變
*
* @param chinese 漢字串
* @return 漢語拼音首字母
*/
public static String cn2FirstSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
if (_t != null) {
pybf.append(_t[0].charAt(0));
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString().replaceAll("\\W", "").trim();
}
/**
* 獲取漢字串拼音,英文字元不變
*
* @param chinese 漢字串
* @return 漢語拼音
*/
public static String cn2Spell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
String x = "嘅囧誰說壞學生來勼髮視訊襠児";
System.out.println(cn2FirstSpell(x));
System.out.println(cn2Spell(x));
}
} 執行結果: kjsshxsljfspde
kaijiongshuishuohuaixueshenglaijiufashipindanger
Process finished with exit code 0 在某些系統上可能有字符集的問題,需要做預處理。