PinYinUtil.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package com.izouma.awesomeAdmin.utils;
  2. import net.sourceforge.pinyin4j.PinyinHelper;
  3. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  5. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
  6. import org.springframework.stereotype.Component;
  7. import java.util.regex.Matcher;
  8. import java.util.regex.Pattern;
  9. /**
  10. * pinyin4j汉字转拼音工具类
  11. *
  12. * @author
  13. */
  14. @Component
  15. public class PinYinUtil {
  16. /**
  17. * 对单个字进行转换
  18. *
  19. * @param pinYinStr 需转换的汉字字符串
  20. * @return 拼音字符串数组
  21. */
  22. public static String getCharPinYin(char pinYinStr) {
  23. if (!isContainChinese(String.valueOf(pinYinStr))) {
  24. return String.valueOf(pinYinStr);
  25. }
  26. //pinyin4j格式类
  27. HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
  28. /*
  29. * 设置需要转换的拼音格式
  30. * 以天为例
  31. * HanyuPinyinToneType.WITHOUT_TONE 转换为tian
  32. * HanyuPinyinToneType.WITH_TONE_MARK 转换为tian1
  33. * HanyuPinyinVCharType.WITH_U_UNICODE 转换为tiān
  34. *
  35. */
  36. format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  37. //拼音字符串数组
  38. String[] pinyin = null;
  39. try {
  40. //执行转换
  41. pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);
  42. } catch (BadHanyuPinyinOutputFormatCombination e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. //pinyin4j规则,当转换的符串不是汉字,就返回null
  47. if (pinyin == null) {
  48. return null;
  49. }
  50. //多音字会返回一个多音字拼音的数组,pinyiin4j并不能有效判断该字的读音
  51. return pinyin[0];
  52. }
  53. /**
  54. * 对单个字进行转换
  55. *
  56. * @param pinYinStr
  57. * @return
  58. */
  59. public static String getStringPinYin(String pinYinStr) {
  60. StringBuffer sb = new StringBuffer();
  61. String tempStr = null;
  62. //循环字符串
  63. for (int i = 0; i < pinYinStr.length(); i++) {
  64. tempStr = getCharPinYin(pinYinStr.charAt(i));
  65. if (tempStr == null) {
  66. //非汉字直接拼接
  67. sb.append(pinYinStr.charAt(i));
  68. } else {
  69. sb.append(tempStr);
  70. }
  71. }
  72. return sb.toString();
  73. }
  74. /**
  75. * 判断字符串中是否包含中文
  76. *
  77. * @param str 待校验字符串
  78. * @return 是否为中文
  79. * @warn 不能校验是否为中文标点符号
  80. */
  81. public static boolean isContainChinese(String str) {
  82. Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
  83. Matcher m = p.matcher(str);
  84. if (m.find()) {
  85. return true;
  86. }
  87. return false;
  88. }
  89. }