背景:
最近项目需要对接外部系统,需要使用到把中文名称转化为拼音。在此先简单记录一下使用到的两个 jar。
pinyin4j 、 jpingyin。
<!-- 汉字转换为拼音pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
<!-- 汉字转换为拼音 jpinyin -->
<dependency>
<groupId>com.github.stuxuhai</groupId>
<artifactId>jpinyin</artifactId>
<version>1.1.3</version>
</dependency>
pinyin4j 的使用
package com.rh.commonutils.pinyin;
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;
/**
* pinyin4j汉字转拼音工具类
*
*/
public class ChangeToPinYin {
//pinyin4j格式类
private static HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
//拼音字符串数组
private static String[] pinyin;
static {
// 设置不带声调标识
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
// 设置字符大写
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
}
/**
* 对单个字进行转换
*
* @param pinYinStr 需转换的汉字字符串
* @return 拼音字符串数组
*/
public static String getCharPinYin(char pinYinStr) {
// format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
try {
//执行转换
pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);
} catch (BadHanyuPinyinOutputFormatCombination e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//pinyin4j规则,当转换的符串不是汉字,就返回null
if (pinyin == null) {
return null;
}
//多音字会返回一个多音字拼音的数组,pinyiin4j并不能有效判断该字的读音
return pinyin[0];
}
/**
* 对单个字进行转换
*
* @param pinYinStr
* @return
*/
public static String getStringPinYin(String pinYinStr) {
StringBuffer sb = new StringBuffer();
String tempStr = null;
//循环字符串
for (int i = 0; i < pinYinStr.length(); i++) {
tempStr = getCharPinYin(pinYinStr.charAt(i));
if (tempStr == null) {
//非汉字直接拼接
sb.append(pinYinStr.charAt(i));
} else {
sb.append(tempStr);
}
}
return sb.toString();
}
public static void main(String[] args) {
// 多音字无法正确处理,会返回词组,只能取其中一个
String str = "参差";
System.out.println(getStringPinYin(str));
char c = '你';
System.out.println(getCharPinYin(c));
}
}
jpinyin 的使用
package com.rh.commonutils.pinyin;
import com.github.stuxuhai.jpinyin.ChineseHelper;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;
public class ChangeToPinYinJP {
/**
* 转换为有声调的拼音字符串
*
* @param pinYinStr 汉字
* @return 有声调的拼音字符串
*/
public static String changeToMarkPinYin(String pinYinStr) {
String tempStr = null;
try {
tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITH_TONE_MARK);
} catch (Exception e) {
e.printStackTrace();
}
return tempStr;
}
/**
* 转换为数字声调字符串
*
* @param pinYinStr 需转换的汉字
* @return 转换完成的拼音字符串
*/
public static String changeToNumberPinYin(String pinYinStr) {
String tempStr = null;
try {
tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITH_TONE_NUMBER);
} catch (Exception e) {
e.printStackTrace();
}
return tempStr;
}
/**
* 转换为不带音调的拼音字符串
*
* @param pinYinStr 需转换的汉字
* @return 拼音字符串
*/
public static String changeToTonePinYin(String pinYinStr) {
String tempStr = null;
try {
tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITHOUT_TONE);
} catch (Exception e) {
e.printStackTrace();
}
return tempStr;
}
/**
* 转换为每个汉字对应拼音首字母字符串
*
* @param pinYinStr 需转换的汉字
* @return 拼音字符串
*/
public static String changeToGetShortPinYin(String pinYinStr) {
String tempStr = null;
try {
tempStr = PinyinHelper.getShortPinyin(pinYinStr);
} catch (Exception e) {
e.printStackTrace();
}
return tempStr;
}
/**
* 检查汉字是否为多音字
*
* @param pinYinStr 需检查的汉字
* @return true 多音字,false 不是多音字
*/
public static boolean checkPinYin(char pinYinStr) {
boolean check = false;
try {
check = PinyinHelper.hasMultiPinyin(pinYinStr);
} catch (Exception e) {
e.printStackTrace();
}
return check;
}
/**
* 简体转换为繁体
*
* @param pinYinStr
* @return
*/
public static String changeToTraditional(String pinYinStr) {
String tempStr = null;
try {
tempStr = ChineseHelper.convertToTraditionalChinese(pinYinStr);
} catch (Exception e) {
e.printStackTrace();
}
return tempStr;
}
/**
* 繁体转换为简体
*
* @param pinYinSt
* @return
*/
public static String changeToSimplified(String pinYinSt) {
String tempStr = null;
try {
tempStr = ChineseHelper.convertToSimplifiedChinese(pinYinSt);
} catch (Exception e) {
e.printStackTrace();
}
return tempStr;
}
public static void main(String[] args) {
String str = "重慶 most input";
System.out.println(changeToSimplified(str));
System.out.println(checkPinYin('重'));
System.out.println(changeToTonePinYin("参差"));
System.out.println(changeToTonePinYin("解亚伟"));// TODO 需要扩展 jar 包里 db里的数据
}
}
jpinyin 相对于 pinyin4j 的优势:
- pinyin4j 对于多音字无法处理,会返回一个列表
- 在pinyin4j的jar上进行了优化,可以实现汉字转换为拼音,并自动识别常用多音字
- 识别是否常用多音字是可以扩展的
- 支持简体转换为繁体,
- 检查是否为简体,
- 是否为繁体,
- 是否为中文字符等功能
识别多音字、繁体等如何扩展:
这个目前并没有深究,看了一下 jar 文件,大致是需要扩展 data 中的数据的。