Java-汉字转拼音

2019年12月02日 19:46 · 阅读(387) ·

目标

实现汉字转拼音功能

参考

https://yq.aliyun.com/articles/18443

开发环境

名称 版本
操作系统 Windows 10 X64
JDK JDK1.8(jdk-8u151-windows-x64)
IntelliJ IDEA IntelliJ IDEA 2018.3
Maven Maven 3.6.0

说明

本文代码在 IntelliJ IDEA 2018.3 创建 Maven 多模块(Module)项目+负载均衡 项目上进行添加操作,不过也可独立出来看。

pom.xml 引用

  1. <!--汉字转拼音-->
  2. <dependency>
  3. <groupId>com.belerweb</groupId>
  4. <artifactId>pinyin4j</artifactId>
  5. <version>2.5.0</version>
  6. </dependency>

公共类-CharacterPinYinConvert

  1. package com.test.invoice.util;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import net.sourceforge.pinyin4j.PinyinHelper;
  5. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  6. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  7. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  8. import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
  9. /**
  10. * 汉字转拼音工具类,保留汉字与字母,其他部分忽略,需添加jar包:pinyin4j-2.5.0.jar
  11. * https://yq.aliyun.com/articles/18443
  12. * @author jianggujin
  13. *
  14. */
  15. public class CharacterPinYinConvert {
  16. /**
  17. * 设置汉字拼音输出的格式
  18. **/
  19. HanyuPinyinOutputFormat format = null;
  20. /**
  21. * 默认构造方法,初始化汉字拼音输出格式
  22. */
  23. public CharacterPinYinConvert() {
  24. // 设置汉字拼音输出的格式
  25. format = new HanyuPinyinOutputFormat();
  26. // 不使用音调标记,
  27. format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  28. // 如果使用WITH_TONE_MARK,则必须指定setVCharType为WITH_U_UNICODE,否则报错
  29. // fmt.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
  30. // fmt.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
  31. // 韵母“驴”(lu->lv)使用V来代替
  32. format.setVCharType(HanyuPinyinVCharType.WITH_V);
  33. // 返回的拼音为小字字母
  34. format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
  35. }
  36. /**
  37. * 汉字转拼音,返回单个转换结果(多音字只取一个结果)
  38. *
  39. * @param text 待转换字符串
  40. * @return allPinYin
  41. */
  42. public String toPinYin(String text) {
  43. StringBuilder allPinYin = new StringBuilder();
  44. for (int i = 0; i < text.length(); i++) {
  45. char wordChar = text.charAt(i);
  46. // 如果为汉字
  47. if (Character.toString(wordChar).matches("[\\u4E00-\\u9FA5]")) {
  48. try {
  49. // 返回汉字的全部拼音(因为有些汉字为多音字,否则只返回一个)
  50. String[] pinYinArray = PinyinHelper.toHanyuPinyinStringArray(
  51. wordChar, format);
  52. // 取第一个拼音
  53. String pinYin = pinYinArray[0];
  54. if (pinYin != null) {
  55. allPinYin.append(pinYin);
  56. }
  57. } catch (Exception e) {
  58. }
  59. } else if (((int) wordChar >= 65 && (int) wordChar <= 90)
  60. || ((int) wordChar >= 97 && (int) wordChar <= 122)) {
  61. allPinYin.append(wordChar);
  62. }
  63. }
  64. return allPinYin.toString();
  65. }
  66. /**
  67. * 汉字转拼音,返回多个转换结果(例如有多音字的情况)
  68. * 英文字母原样显示,数字和字符不显示,例如:123ABC-罗马,输出 ABCLUOMA
  69. *
  70. * @param text 待转换字符串
  71. * @return pinYinSet
  72. */
  73. public Set<String> toPinYins(String text) {
  74. char[] srcChar = text.toCharArray();
  75. String[][] temp = new String[text.length()][];
  76. for (int i = 0; i < srcChar.length; i++) {
  77. char c = srcChar[i];
  78. if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]")) {
  79. try {
  80. temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i],
  81. format);
  82. } catch (Exception e) {
  83. }
  84. } else if (((int) c >= 65 && (int) c <= 90)
  85. || ((int) c >= 97 && (int) c <= 122)) {
  86. temp[i] = new String[]{String.valueOf(srcChar[i])};
  87. } else {
  88. temp[i] = new String[]{""};
  89. }
  90. }
  91. String[] pingyinArray = doExchange(temp)[0];
  92. Set<String> pinyinSet = new HashSet<String>();
  93. for (int i = 0; i < pingyinArray.length; i++) {
  94. pinyinSet.add(pingyinArray[i]);
  95. }
  96. return pinyinSet;
  97. }
  98. /**
  99. * 处理转换
  100. *
  101. * @return
  102. */
  103. private String[][] doExchange(String[][] strJaggedArray) {
  104. int len = strJaggedArray.length;
  105. if (len >= 2) {
  106. int len1 = strJaggedArray[0].length;
  107. int len2 = strJaggedArray[1].length;
  108. int newlen = len1 * len2;
  109. String[] temp = new String[newlen];
  110. int index = 0;
  111. for (int i = 0; i < len1; i++) {
  112. for (int j = 0; j < len2; j++) {
  113. temp[index] = strJaggedArray[0][i] + strJaggedArray[1][j];
  114. index++;
  115. }
  116. }
  117. String[][] newArray = new String[len - 1][];
  118. for (int i = 2; i < len; i++) {
  119. newArray[i - 1] = strJaggedArray[i];
  120. }
  121. newArray[0] = temp;
  122. return doExchange(newArray);
  123. } else {
  124. return strJaggedArray;
  125. }
  126. }
  127. }

接口类

  1. /**
  2. * WebClientTest
  3. * @return String
  4. */
  5. @PostMapping("/Test/PinYin")
  6. public ResponseVO PinYin(){
  7. ResponseVO responseVO = new ResponseVO<String>();
  8. CharacterPinYinConvert convert = new CharacterPinYinConvert();
  9. responseVO.setData(convert.toPinYin("罗马")+"======"+convert.toPinYins("一加一的和等于二"));
  10. return responseVO;
  11. }

测试

convert.toPinYin() ,只显示一个结果(即使有多音字)

convert.toPinYins() ,显示多个结果(多音字的情况)

接口多音字部分的值

  1. YIJIAYIDIHUDENGYUER
  2. YIJIAYIDEHUODENGYUER
  3. YIJIAYIDEHUDENGYUER
  4. YIJIAYIDIHEDENGYUER
  5. YIJIAYIDEHAIDENGYUER
  6. YIJIAYIDIHUODENGYUER
  7. YIJIAYIDIHAIDENGYUER
  8. YIJIAYIDEHEDENGYUER