将漢字轉換為拼音在Android開發中是個很常見的問題。例如:在Android手機應用開發中,要查詢聯系人的姓名,通常都是用拼音進行查詢的。
Pinyin4j是一個功能強悍的漢語拼音工具包,是sourceforge.net上的一個開源項目。
主要的功能有:
- 支援同一漢字有多個發音
- 支援拼音的格式化輸出,比如第幾聲之類的
- 支援簡體中文、繁體中文轉換為拼音
首先,在Android Studio中的使用應該将pinyin4j的包放入到libs檔案夾下,然後在需要使用到pinyin4j時就在類中import要使用的相應類即可。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISOygDNycDMzEDNyIDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
檢查在build.gradle中是否已經導入PinYin4j.jar的存放路徑
1.基本用法(單個漢字轉拼音):
PinyinHelper類中的靜态方法toHanyuPinyinStringArray傳回的資料類型是一個String數組,它用來接收一個漢字的多個發音,如果toHanyuPinyinStringArray中的參數不是漢字,那麼它會傳回null。
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray('行');
for (int i = ; 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 = ; 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 = ; i < nameChar.length; i++) {
if (nameChar[i] > ) {
try {
pinyinName += PinyinHelper.toHanyuPinyinStringArray(
nameChar[i], defaultFormat)[].charAt();
} 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() >
&& !"null".equals(inputString)) {
char[] input = inputString.trim().toCharArray();
try {
for (int i = ; i < input.length; i++) {
if (java.lang.Character.toString(input[i]).matches(
"[\\u4E00-\\u9FA5]+")) {
String[] temp = PinyinHelper.toHanyuPinyinStringArray(
input[i], format);
output += temp[];
} 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 = ; i < nameChar.length; i++) {
if (nameChar[i] > ) {
try {
pinyinName += PinyinHelper.toHanyuPinyinStringArray(
nameChar[i], defaultFormat)[].charAt();
} 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