最近在项目中遇到了要将火车站名转换为全拼与简拼,在网上找了几种方法,又在大神同事的帮忙下,找到了一种比较好的方法,在此分享给有需要的朋友。
一、依赖导入
gradle导入:
compile 'com.belerweb:pinyin4j:2.5.0'
maven导入:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
二、txt文件
复制粘贴为duoyinzi_pinyin.txt文件,放在项目的resources目录下
三、工具类
public class PinyinUtils {
public static Map<String, String> dictionary = new HashMap<>();
//加载多音字词典
static {
ClassPathResource resource = new ClassPathResource("duoyinzi_pinyin.txt");
try (BufferedReader br = resource.getReader(Charset.forName("UTF-8"))) {
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split("#");
if (StringUtils.isNotEmpty(arr[1])) {
String[] sems = arr[1].split(" ");
for (String sem : sems) {
if (StringUtils.isNotEmpty(sem)) {
dictionary.put(sem, arr[0]);
}
}
}
}
} catch (IOException e) {
throw new ServiceException("读取文件失败,reader close 失败");
}
}
public static String[] chineseToPinYin(char chineseCharacter) throws BadHanyuPinyinOutputFormatCombination {
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
if (chineseCharacter >= 32 && chineseCharacter <= 125) { //ASCII >=33 ASCII<=125的直接返回 ,ASCII码表:http://www.asciitable.com/
return new String[]{String.valueOf(chineseCharacter)};
}
return PinyinHelper.toHanyuPinyinStringArray(chineseCharacter, outputFormat);
}
/**
* 获取汉字拼音的全拼
*
* @param chineseCharacter 需要转换的文字
* @return 转换完成的全拼
* @throws BadHanyuPinyinOutputFormatCombination
*/
public static String chineseToPinYinF(String chineseCharacter) throws BadHanyuPinyinOutputFormatCombination {
if (StringUtils.isEmpty(chineseCharacter)) {
return null;
}
char[] chs = chineseCharacter.toCharArray();
StringBuilder result = new StringBuilder();
for (int i = 0; i < chs.length; i++) {
String[] arr = chineseToPinYin(chs[i]);
if (arr == null) {
result.append("");
} else if (arr.length == 1) {
result.append(arr[0]);
} else if (arr[0].equals(arr[1])) {
result.append(arr[0]);
} else {
String prim = chineseCharacter.substring(i, i + 1);
String lst = null, rst = null;
if (i <= chineseCharacter.length() - 2) {
rst = chineseCharacter.substring(i, i + 2);
}
if (i >= 1 && i + 1 <= chineseCharacter.length()) {
lst = chineseCharacter.substring(i - 1, i + 1);
}
String answer = null;
for (String py : arr) {
if (StringUtils.isEmpty(py)) {
continue;
}
if ((lst != null && py.equals(dictionary.get(lst))) ||
(rst != null && py.equals(dictionary.get(rst)))) {
answer = py;
break;
}
if (py.equals(dictionary.get(prim))) {
answer = py;
}
}
if (answer != null) {
result.append(answer);
}
}
}
return result.toString().toLowerCase();
}
/**
* 获取简拼
*
* @param chineseCharacter 需要转换的汉字
* @return 转换后的简拼
*/
public static String chineseToPinYinS(String chineseCharacter) {
if (StringUtils.isEmpty(chineseCharacter)) {
return null;
}
char[] chs = chineseCharacter.toCharArray();
StringBuilder result = new StringBuilder();
for (int i = 0; i < chs.length; i++) {
String[] arr = new String[0];
try {
arr = chineseToPinYin(chs[i]);
} catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
badHanyuPinyinOutputFormatCombination.printStackTrace();
}
if (arr == null) {
result.append("");
} else if (arr.length == 1) {
result.append(arr[0].charAt(0));
} else if (arr[0].equals(arr[1])) {
result.append(arr[0].charAt(0));
} else {
String prim = chineseCharacter.substring(i, i + 1);
String lst = null, rst = null;
if (i <= chineseCharacter.length() - 2) {
rst = chineseCharacter.substring(i, i + 2);
}
if (i >= 1 && i + 1 <= chineseCharacter.length()) {
lst = chineseCharacter.substring(i - 1, i + 1);
}
String answer = null;
for (String py : arr) {
if (StringUtils.isEmpty(py)) {
continue;
}
if ((lst != null && py.equals(dictionary.get(lst))) ||
(rst != null && py.equals(dictionary.get(rst)))) {
answer = py;
break;
}
if (py.equals(dictionary.get(prim))) {
answer = py;
}
}
if (answer != null) {
result.append(answer.charAt(0));
}
}
}
return result.toString().toUpperCase();
}
}
四、使用
直接调用即可