將漢字轉(zhuǎn)換為拼音在Android開發(fā)中是個(gè)很常見的問題。例如:在Android手機(jī)應(yīng)用開發(fā)中,要查詢聯(lián)系人的姓名,通常都是用拼音進(jìn)行查詢的。
Pinyin4j是一個(gè)功能強(qiáng)悍的漢語拼音工具包,是sourceforge.net上的一個(gè)開源項(xiàng)目。
主要的功能有:
- 支持同一漢字有多個(gè)發(fā)音
- 支持拼音的格式化輸出,比如第幾聲之類的
-
支持簡體中文、繁體中文轉(zhuǎn)換為拼音
首先,在Android Studio中的使用應(yīng)該將pinyin4j的包放入到libs文件夾下,然后在需要使用到pinyin4j時(shí)就在類中import要使用的相應(yīng)類即可。
這里寫圖片描述
檢查在build.gradle中是否已經(jīng)導(dǎo)入PinYin4j.jar的存放路徑
這里寫圖片描述
1.基本用法(單個(gè)漢字轉(zhuǎn)拼音):
PinyinHelper類中的靜態(tài)方法toHanyuPinyinStringArray返回的數(shù)據(jù)類型是一個(gè)String數(shù)組,它用來接收一個(gè)漢字的多個(gè)發(fā)音,如果toHanyuPinyinStringArray中的參數(shù)不是漢字,那么它會(huì)返回null。
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray('行');
for (int i = 0; i < pinyinArray.length; ++i)
{
Log.d("TAG", pinyinArray[i]);
}
結(jié)果輸出:
可以看到“行”字有這么5種發(fā)音,后面的數(shù)字代表第幾聲。
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:無音標(biāo) (xing)
- WITH_TONE_NUMBER:1-4數(shù)字表示英標(biāo) (xing2)
- WITH_TONE_MARK:直接用音標(biāo)符
-->使用:format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
雖然pinyin4j很好用,但是還是有局限的。以上代碼只能獲取單個(gè)漢字的拼音,但是不能獲取一個(gè)包含多音字的詞的拼音。例如“重慶”,無法判斷到底是“chongqing”還是“zhongqing”,pinyin4j不能通過上下文來判斷多音字的讀音。
所以,在獲取一個(gè)包含多音字的詞語的讀音,可以返回一個(gè)列表,正確的讀音只能是人工判斷選擇。
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;
}
/**
* 將字符串中的中文轉(zhuǎn)化為拼音,英文字符不變
*
* @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;
}
/**
* 漢字轉(zhuǎn)換位漢語拼音首字母,英文字符不變
*
* @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;
}
}
在實(shí)際開發(fā)中如果我們要將一段文字中的漢字全部轉(zhuǎn)換成不帶音調(diào)的拼音輸出,而這段文字中又可能包含阿拉伯?dāng)?shù)字、英文、標(biāo)點(diǎn)符號等等。如果完全靠自己寫代碼進(jìn)行轉(zhuǎn)換,那是非常麻煩的,其中一個(gè)首先就要區(qū)別,這段文字中那些是漢字,那些是非漢字。有了Pinyin4j,這個(gè)問題就不再困難了
String strs = PinyinUtils.getPingYin("新年好!Hello,新年大家都過得開心吧?哈哈,我是做Android開發(fā)噠,what's this?");
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(strs);
Log.d("TAG", strs);
結(jié)果輸出:
xinnianhao!Hello,xinniandajiadouguodekaixinba?haha,woshizuoAndroidkaifada,what's this?
Dome下載
下載pinyin4j-2.5.0.jar