汉字转换拼音在日常开发中是个很常见的问题。例如我们伟大的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
在某些系统上可能有字符集的问题,需要做预处理。