一、简述
实现方法多样,在此列举两种,一种是比较简单,但是实现自定义稍差,还有一种就是自己写实现逻辑
二、代码
需要的jar包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.3</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
代码工具类
法一:使用已有的hutool工具类,里面包含了拼音转换的处理。需要搭配pinyin4j包。
import cn.hutool.extra.pinyin.PinyinUtil;
import cn.hutool.extra.pinyin.engine.pinyin4j.Pinyin4jEngine;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
public class PinyinTest {
public static void main(String[] args) {
//简单实现
String str = PinyinUtil.getPinyin("吕仇","-");
System.out.println(str);
//自定义实现
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);// 大小写
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不加声调
format.setVCharType(HanyuPinyinVCharType.WITH_V);// 'ü' 使用 "v" 代替
Pinyin4jEngine engine = new Pinyin4jEngine(format);
String pinyin = engine.getPinyin("吕仇", " ");
System.out.println(pinyin);
}
}
法二:直接使用pinyin4j包,自己封装一下实现逻辑。其实与hutool工具一样,只不过可以根据项目需求更加灵活。以下就是我写的实现了多音字全部返回。
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;
import java.util.*;
/**
* @author : ZhiPengyu
* @ClassName : [NameUtil]
* @Description : [处理中文姓名相关]
* @CreateDate : [2021/10/20 16:31]
*/
public class NameUtils {
/**
* 中文转拼音(大写,无音标)
* @param chineseStr
* @return
*/
public static Set<String> getAllPinyin(String chineseStr) {
//输出格式设置
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
/**
* 输出大小写设置
*
* LOWERCASE:输出小写
* UPPERCASE:输出大写
*/
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
/**
* 输出音标设置
*
* WITH_TONE_MARK:直接用音标符(必须设置WITH_U_UNICODE,否则会抛出异常)
* WITH_TONE_NUMBER:1-4数字表示音标
* WITHOUT_TONE:没有音标
*/
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
/**
* 特殊音标ü设置
*
* WITH_V:用v表示ü
* WITH_U_AND_COLON:用"u:"表示ü
* WITH_U_UNICODE:直接用ü
*/
format.setVCharType(HanyuPinyinVCharType.WITH_V);
char[] hanYuArr = chineseStr.trim().toCharArray();
Set<String> nameSet = new LinkedHashSet<>();
try {
for (int i = 0, len = hanYuArr.length; i < len; i++) {
//匹配是否是汉字
if (Character.toString(hanYuArr[i]).matches("[\\u4E00-\\u9FA5]+")) {
//如果是多音字,返回多个拼音
String[] pys = PinyinHelper.toHanyuPinyinStringArray(hanYuArr[i], format);
if (nameSet.isEmpty()){
nameSet.addAll(Arrays.asList(pys));
}else{
Set<String> term = new HashSet<>();
for(String a1 : nameSet){
for(String a2 : pys){
term.add(a1+a2);
}
}
nameSet = term;
}
} else {
Set<String> term = new HashSet<>();
for(String a : nameSet){
term.add(a + hanYuArr[i]);
}
nameSet = term;
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return nameSet;
}
private NameUtils() {
}
}