pinyin4j是一个开源的java库,用来处理中文转换成拼音(汉语拼音,罗马拼音等),功能强大。
引入依赖
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
有几个常用的类:
- net.sourceforge.pinyin4j.PinyinHelper::为中文转汉语拼音、中文转罗马拼音提供了一些方法
- net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat:用于设置汉语拼音字符串的输出格式
- net.sourceforge.pinyin4j.format.HanyuPinyinCaseType:如何输出汉语拼音、大写还是小写
- net.sourceforge.pinyin4j.format.HanyuPinyinToneType:如何输出拼音音调
- net.sourceforge.pinyin4j.format.HanyuPinyinVCharType:如何输出拼音音调为’ü’时的格式
在JAVA 编程中我们经常免不了需要对中文排序,而往往我们排序的依据就是中文的首字母,当然无论依据什么排序,我们都需要将中文转换成为String,下面的工具类就可以做到这一点
public class PingYinUtil {
/**
* 将字符串中的中文转化为拼音,其他字符不变
*
* @param chinese
* @return
*/
public static String getPingYin(String chinese) {
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.WITHOUT_TONE);
/* 设置转换后拼音是否输出韵母
WITH_V:用v表示ü (nv)
WITH_U_AND_COLON:用"u:"表示ü (nu:)
WITH_U_UNICODE:直接用ü (nü)
*/
format.setVCharType(HanyuPinyinVCharType.WITH_V);
StringBuilder sb = new StringBuilder();
char[] arr = chinese.trim().toCharArray();
try {
for (char c : arr) {
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
//toHanyuPinyinStringArray有个容错判断 如果传入的不是汉字,就不能转换成拼音,那么直接返回null可以用正则表达式判断是否是中文,Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")
String[] temp = PinyinHelper.toHanyuPinyinStringArray(c, format);
sb.append(temp[0]);
continue;
}
sb.append(c);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 获取汉字串拼音首字母,英文字符不变
*
* @param chinese 汉字串
* @param type 小于等于0:取汉字串拼音首字母;大于0:获取汉字串全拼音
* @return 汉语拼音首字母
*/
public static String getPingYin(String chinese, int type) {
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.WITHOUT_TONE);
StringBuilder sb = new StringBuilder();
char[] arr = chinese.trim().toCharArray();
try {
for (char c : arr) {
//ASCII码表上一个128个字符,对应的索引为0-127,大于128表示非ASCII字符
if (c > 128) {
//toHanyuPinyinStringArray有个容错判断 如果传入的不是汉字,就不能转换成拼音,那么直接返回null可以用正则表达式判断是否是中文,Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")
String[] temp = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (temp != null) {
//输出全拼音
if (type <= 0) {
sb.append(PinyinHelper.toHanyuPinyinStringArray(c, format)[0]);
}
//输出拼音首字母
else {
sb.append(temp[0].charAt(0));
}
}
continue;
}
sb.append(c);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return sb.toString().replaceAll("\\W", "").trim();
}
public static void main(String[] args) {
System.out.println(PingYinUtil.getPingYin("欧阳剑鹏"));
System.out.println(PingYinUtil.getPingYin("欧阳剑鹏",0));
System.out.println(PingYinUtil.getPingYin("欧阳剑鹏",1));
System.out.println("------------------------");
System.out.println(PingYinUtil.getPingYin("1欧a阳c剑@@鹏"));
System.out.println(PingYinUtil.getPingYin("1欧a阳c剑@@鹏",0));
System.out.println(PingYinUtil.getPingYin("1欧a阳c剑@@鹏",1));
}
}
测试结果