fix pinyin

This commit is contained in:
Looly 2020-06-17 02:15:40 +08:00
parent 3bca95c34a
commit 63ccb9b0eb
3 changed files with 22 additions and 10 deletions

View File

@ -48,6 +48,6 @@ public interface PinyinEngine {
default String getFirstLetter(String str, String separator) { default String getFirstLetter(String str, String separator) {
final String splitSeparator = StrUtil.isEmpty(separator) ? "#" : separator; final String splitSeparator = StrUtil.isEmpty(separator) ? "#" : separator;
final String[] split = StrUtil.split(getPinyin(str, splitSeparator), splitSeparator); final String[] split = StrUtil.split(getPinyin(str, splitSeparator), splitSeparator);
return ArrayUtil.join(split, separator, (s)->String.valueOf(s.charAt(0))); return ArrayUtil.join(split, separator, (s)->String.valueOf(s.length() > 0 ? s.charAt(0) : ""));
} }
} }

View File

@ -1,5 +1,6 @@
package cn.hutool.extra.pinyin.engine.pinyin4j; package cn.hutool.extra.pinyin.engine.pinyin4j;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.pinyin.PinyinEngine; import cn.hutool.extra.pinyin.PinyinEngine;
@ -83,16 +84,27 @@ public class Pinyin4jEngine implements PinyinEngine {
@Override @Override
public String getPinyin(String str, String separator) { public String getPinyin(String str, String separator) {
// 添加一个后缀是为了解决Pinyin4j的bug在指定分隔符后最后两个词的分隔符失效 final StrBuilder result = StrUtil.strBuilder();
str += StrUtil.SPACE; boolean isFirst = true;
String result; final int strLen = str.length();
try { try {
result = PinyinHelper.toHanYuPinyinString(str, format, separator, true); for(int i = 0; i < strLen; i++){
if(isFirst){
isFirst = false;
} else{
result.append(separator);
}
final String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(str.charAt(i), format);
if(ArrayUtil.isEmpty(pinyinStringArray)){
result.append(str.charAt(i));
} else{
result.append(pinyinStringArray[0]);
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) { } catch (BadHanyuPinyinOutputFormatCombination e) {
throw new PinyinException(e); throw new PinyinException(e);
} }
return StrUtil.removeSuffix(result, StrUtil.SPACE); return result.toString();
} }
} }

View File

@ -13,10 +13,10 @@ public class PinyinUtilTest {
} }
@Test @Test
public void getPinyinByPinyin4jTest(){ public void getPinyinByPinyin4jTest() {
final Pinyin4jEngine engine = new Pinyin4jEngine(); final Pinyin4jEngine engine = new Pinyin4jEngine();
final String pinyin = engine.getPinyin("你好", " "); final String pinyin = engine.getPinyin("你好h", " ");
Assert.assertEquals("ni hao", pinyin); Assert.assertEquals("ni hao h", pinyin);
} }
@Test @Test