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 74e40bb3e..9ffc2c8bf 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 @@ -21,6 +21,17 @@ public interface PinyinEngine { */ String getPinyin(char c); + /** + * 如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c) + * + * @param c 任意字符,汉字返回拼音,非汉字原样返回 + * @param tone 是否返回声调 + * @return 汉字返回拼音,非汉字原样返回 + */ + default String getPinyin(char c, boolean tone){ + return getPinyin(c); + } + /** * 获取字符串对应的完整拼音,非中文返回原字符 * @@ -30,6 +41,19 @@ public interface PinyinEngine { */ String getPinyin(String str, String separator); + /** + * 获取字符串对应的完整拼音,非中文返回原字符 + * + * @param str 字符串 + * @param separator 拼音之间的分隔符 + * @param tone 是否返回声调 + * @return 拼音 + */ + default String getPinyin(String str, String separator,boolean tone){ + return getPinyin(str, separator); + } + + /** * 将输入字符串转为拼音首字母,其它字符原样返回 * diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java index e1f618ac1..d6ac1497f 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java @@ -31,6 +31,17 @@ public class PinyinUtil { return getEngine().getPinyin(c); } + /** + * 如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c) + * + * @param c 任意字符,汉字返回拼音,非汉字原样返回 + * @param tone 是否返回声调 + * @return 汉字返回拼音,非汉字原样返回 + */ + public static String getPinyin(final char c, boolean tone) { + return getEngine().getPinyin(c,tone); + } + /** * 将输入字符串转为拼音,每个字之间的拼音使用空格分隔 * @@ -41,6 +52,17 @@ public class PinyinUtil { return getPinyin(str, StrUtil.SPACE); } + /** + * 将输入字符串转为拼音,每个字之间的拼音使用空格分隔 + * + * @param str 任意字符,汉字返回拼音,非汉字原样返回 + * @param tone 是否返回声调 + * @return 汉字返回拼音,非汉字原样返回 + */ + public static String getPinyin(final String str, boolean tone) { + return getPinyin(str, StrUtil.SPACE, tone); + } + /** * 将输入字符串转为拼音,以字符为单位插入分隔符 * @@ -52,6 +74,18 @@ public class PinyinUtil { return getEngine().getPinyin(str, separator); } + /** + * 将输入字符串转为拼音,以字符为单位插入分隔符 + * + * @param str 任意字符,汉字返回拼音,非汉字原样返回 + * @param separator 每个字拼音之间的分隔符 + * @param tone 是否返回声调 + * @return 汉字返回拼音,非汉字原样返回 + */ + public static String getPinyin(final String str, final String separator, boolean tone) { + return getEngine().getPinyin(str, separator, tone); + } + /** * 将输入字符串转为拼音首字母,其它字符原样返回 * diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/bopomofo4j/Bopomofo4jEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/bopomofo4j/Bopomofo4jEngine.java index 433f5d30b..7980704c7 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/bopomofo4j/Bopomofo4jEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/bopomofo4j/Bopomofo4jEngine.java @@ -36,8 +36,26 @@ public class Bopomofo4jEngine implements PinyinEngine { return Bopomofo4j.pinyin(String.valueOf(c), ToneType.WITHOUT_TONE, false, false, StrUtil.EMPTY); } + @Override + public String getPinyin(char c, boolean tone) { + if (tone) { + return Bopomofo4j.pinyin(String.valueOf(c), ToneType.WITH_VOWEL_TONE, false, false, StrUtil.EMPTY); + }else{ + return getPinyin(c); + } + } + @Override public String getPinyin(String str, String separator) { return Bopomofo4j.pinyin(str, ToneType.WITHOUT_TONE, false, false, separator); } + + @Override + public String getPinyin(String str, String separator, boolean tone) { + if (tone) { + return Bopomofo4j.pinyin(str, ToneType.WITH_VOWEL_TONE, false, false, separator); + }else{ + return getPinyin(str, separator); + } + } } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/houbbpinyin/HoubbPinyinEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/houbbpinyin/HoubbPinyinEngine.java index 323ef1718..c3f8dee04 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/houbbpinyin/HoubbPinyinEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/houbbpinyin/HoubbPinyinEngine.java @@ -65,10 +65,28 @@ public class HoubbPinyinEngine implements PinyinEngine { return result; } + @Override + public String getPinyin(char c, boolean tone) { + if (tone){ + return PinyinHelper.toPinyin(String.valueOf(c), PinyinStyleEnum.DEFAULT); + }else { + return getPinyin(c); + } + } + @Override public String getPinyin(String str, String separator) { String result; result = PinyinHelper.toPinyin(str, format, separator); return result; } + + @Override + public String getPinyin(String str, String separator, boolean tone) { + if(tone){ + return PinyinHelper.toPinyin(str, PinyinStyleEnum.DEFAULT, separator); + }else { + return getPinyin(str,separator); + } + } } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/jpinyin/JPinyinEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/jpinyin/JPinyinEngine.java index c0a247ad2..f52722dbc 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/jpinyin/JPinyinEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/engine/jpinyin/JPinyinEngine.java @@ -53,6 +53,16 @@ public class JPinyinEngine implements PinyinEngine { return ArrayUtil.isEmpty(results) ? String.valueOf(c) : results[0]; } + @Override + public String getPinyin(char c, boolean tone) { + if (tone) { + String[] results = PinyinHelper.convertToPinyinArray(c, PinyinFormat.WITH_TONE_MARK); + return ArrayUtil.isEmpty(results) ? String.valueOf(c) : results[0]; + }else { + return getPinyin(c); + } + } + @Override public String getPinyin(String str, String separator) { try { @@ -61,4 +71,19 @@ public class JPinyinEngine implements PinyinEngine { throw new cn.hutool.extra.pinyin.PinyinException(e); } } + + @Override + public String getPinyin(String str, String separator, boolean tone) { + if (tone) { + try { + return PinyinHelper.convertToPinyinString(str, separator, PinyinFormat.WITH_TONE_MARK); + } catch (PinyinException e) { + throw new cn.hutool.extra.pinyin.PinyinException(e); + } + }else { + return getPinyin(str, separator); + } + + } + } 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 241d12bdc..de332ea4a 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 @@ -82,6 +82,31 @@ public class Pinyin4jEngine implements PinyinEngine { return result; } + @Override + public String getPinyin(char c, boolean tone) { + String result; + if(tone){ + try { + //增加声调 + HanyuPinyinOutputFormat formatTemp = new HanyuPinyinOutputFormat(); + // 小写 + formatTemp.setCaseType(HanyuPinyinCaseType.LOWERCASE); + // 加声调 + formatTemp.setToneType(HanyuPinyinToneType.WITH_TONE_MARK); + // + formatTemp.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); + String[] results = PinyinHelper.toHanyuPinyinStringArray(c, formatTemp); + result = ArrayUtil.isEmpty(results) ? String.valueOf(c) : results[0]; + } catch (BadHanyuPinyinOutputFormatCombination e) { + result = String.valueOf(c); + } + }else { + result = getPinyin(c); + } + return result; + + } + @Override public String getPinyin(String str, String separator) { final StrBuilder result = StrUtil.strBuilder(); @@ -107,4 +132,41 @@ public class Pinyin4jEngine implements PinyinEngine { return result.toString(); } + + @Override + public String getPinyin(String str, String separator, boolean tone) { + if(tone){ + final StrBuilder result = StrUtil.strBuilder(); + boolean isFirst = true; + final int strLen = str.length(); + try { + for(int i = 0; i < strLen; i++){ + if(isFirst){ + isFirst = false; + } else{ + result.append(separator); + } + //增加声调 + HanyuPinyinOutputFormat formatTemp = new HanyuPinyinOutputFormat(); + // 小写 + formatTemp.setCaseType(HanyuPinyinCaseType.LOWERCASE); + // 加声调 + formatTemp.setToneType(HanyuPinyinToneType.WITH_TONE_MARK); + // + formatTemp.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); + final String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(str.charAt(i), formatTemp); + if(ArrayUtil.isEmpty(pinyinStringArray)){ + result.append(str.charAt(i)); + } else{ + result.append(pinyinStringArray[0]); + } + } + } catch (BadHanyuPinyinOutputFormatCombination e) { + throw new PinyinException(e); + } + return result.toString(); + }else { + return getPinyin(str, separator); + } + } }