有时候,我们需要将汉字转化成拼音,以方便查询,如图书系统中用拼音检索书籍,以及通讯录中快速查找联系人等。一个方法是使用Map容器对,将汉字与拼音对应,如“中”对应“zhong”。但由于Map的自身限制,在多音字如“重”可对应“chong”、“zhong”,这时候就会出现问题。
Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大。
Pinyin4j的实例:
public static String converterToFirstSpell(String chinese) {
String pinyinName = "";
char[] nameChar = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);
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;
}
先将string转换成char[],再统一将所有字符进行转换
转换方式为:
1. 字母大小写设置
. setCaseType(HanyuPinyinCaseType.LOWERCASE) 将拼音以小写字母输出
(上海 –>shanghai)
.setCaseType(HanyuPinyinCaseType.UPPERCASE) 将拼音以大写字母输出
(上海 –>SHANGHAI)
2.拼音音调设置
. setToneType(HanyuPinyinToneType.WITHOUT_TONE) 无音调显示
( 刘–>liu)
.setToneType(HanyuPinyinToneType.WITH_TONE_NUMBER)用数字表示声调
( 刘–>liu4)
. setToneType(HanyuPinyinToneType.WITH_TONE_MARK) 用声调符表示
( 刘–> liú )
3.多音字输出(仅在存在多音字情况下)
例如:“重”可输出为
.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0] –>zhong
.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[1] –>chong
4.特殊拼音输出格式
例如:“绿”可输出为
.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON) –> lu:
.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE) –>lü
.setVCharType(HanyuPinyinVCharType.WITH_V) –> lv
5.拼音特定位
例如:“重”可输出为
.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0].charAt(0) –>z
.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0].charAt(1) –>h
.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0].charAt(2) –>o