diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java index 6df9a8446..9a6d8904e 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinEngine.java @@ -48,6 +48,6 @@ public interface PinyinEngine { default String getFirstLetter(String str, String separator) { final String splitSeparator = StrUtil.isEmpty(separator) ? "#" : separator; 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) : "")); } } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/pinyin4j/Pinyin4jEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/pinyin4j/Pinyin4jEngine.java index a70e27cc6..a82562f1e 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/pinyin4j/Pinyin4jEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/pinyin4j/Pinyin4jEngine.java @@ -1,5 +1,6 @@ package cn.hutool.extra.pinyin.engine.pinyin4j; +import cn.hutool.core.text.StrBuilder; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.pinyin.PinyinEngine; @@ -83,16 +84,27 @@ public class Pinyin4jEngine implements PinyinEngine { @Override public String getPinyin(String str, String separator) { - // 添加一个后缀是为了解决Pinyin4j的bug,在指定分隔符后,最后两个词的分隔符失效 - str += StrUtil.SPACE; - String result; + final StrBuilder result = StrUtil.strBuilder(); + boolean isFirst = true; + final int strLen = str.length(); 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) { throw new PinyinException(e); } - return StrUtil.removeSuffix(result, StrUtil.SPACE); + return result.toString(); } - } diff --git a/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java index deae1c881..751fa53ee 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java @@ -13,10 +13,10 @@ public class PinyinUtilTest { } @Test - public void getPinyinByPinyin4jTest(){ + public void getPinyinByPinyin4jTest() { final Pinyin4jEngine engine = new Pinyin4jEngine(); - final String pinyin = engine.getPinyin("你好", " "); - Assert.assertEquals("ni hao", pinyin); + final String pinyin = engine.getPinyin("你好h", " "); + Assert.assertEquals("ni hao h", pinyin); } @Test