当前位置:   article > 正文

Pinyin4j 汉字转拼音使用教程_com.belerweb:pinyin4j

com.belerweb:pinyin4j

目录

Pinyin4j 概述与下载

Pinyin4j 使用快速入门


Pinyin4j 概述与下载

1、pinyin4j 是一个开源的流行 java 库,用来处理中文转换成拼音,拼音输出格式可定制。

  1. <!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
  2. <dependency>
  3. <groupId>com.belerweb</groupId>
  4. <artifactId>pinyin4j</artifactId>
  5. <version>2.5.0</version>
  6. </dependency>

2、pinyin4j 有几个常用的类:

net.sourceforge.pinyin4j.PinyinHelper用于将中文字符(简体和繁体)转成拼音
net.sourceforge.pinyin4j.format.HanyuPinyinCaseType定义拼音大小写
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat定义汉语拼音输出格式
net.sourceforge.pinyin4j.format.HanyuPinyinToneType定义汉语拼音的音调/音标输出格式
net.sourceforge.pinyin4j.format.HanyuPinyinVCharType定义字符'u'的输出格式,因为 ü 是汉语拼音中的一个特殊字符

Pinyin4j 使用快速入门

  1. /**
  2. * 汉字转汉语拼音。这是底层方法,然后提供重载方法,简化参数传递
  3. * {@// TODO: 2020/6/4 因为汉语的博大精深,所以对于多音字的处理本方法暂时无法提供有效支持 }
  4. * <p>
  5. * {@link HanyuPinyinOutputFormat} 汉语拼音输出格式设置
  6. * {@link HanyuPinyinCaseType} 设置拼音大小写:UPPERCASE(大写)、LOWERCASE(小写)
  7. * {@link HanyuPinyinToneType} 设置拼音音调:WITHOUT_TONE(无音标)、WITH_TONE_MARK(拼音上面带音标)、WITH_TONE_NUMBER(用1-4表示音调)
  8. * {@link HanyuPinyinVCharType} 设置特殊音标ü:WITH_V(用 v 表示 ü)、WITH_U_AND_COLON(用 "u:" 表示 ü)、WITH_U_UNICODE(直接用 ü)
  9. * 注意:toneType 为 WITH_TONE_MARK 时,charType 必须为 WITH_U_UNICODE,否则异常。
  10. *
  11. * @param text :待转换的源字符串,不能为 null
  12. * @param caseType :拼音大小写,1 表示大写,2 表示小写,3 表示首字母大写
  13. * @param toneType :拼音音调,1 无音调,2 拼音上方加音调,3 用数字表示音调
  14. * @param charType :特殊音标ü显示方式,1 用 v 显示,2 用 ü 表示,3 用 u: 表示
  15. * @param spacer :拼音与拼音之间的分隔符
  16. * @return
  17. */
  18. public static String textToHanYuPinyin(String text, int caseType, int toneType, int charType, String spacer) {
  19. StringBuffer result = new StringBuffer();
  20. try {
  21. Assert.notNull(text, "待转换文本不能为空!");
  22. HanyuPinyinCaseType pinyinCaseType = caseType == 1 ? HanyuPinyinCaseType.UPPERCASE : HanyuPinyinCaseType.LOWERCASE;
  23. HanyuPinyinToneType pinyinToneType = toneType == 1 ? HanyuPinyinToneType.WITHOUT_TONE : toneType == 2 ? HanyuPinyinToneType.WITH_TONE_MARK : HanyuPinyinToneType.WITH_TONE_NUMBER;
  24. HanyuPinyinVCharType pinyinVCharType = charType == 1 ? HanyuPinyinVCharType.WITH_V : charType == 2 ? HanyuPinyinVCharType.WITH_U_UNICODE : HanyuPinyinVCharType.WITH_U_AND_COLON;
  25. //toneType 为 WITH_TONE_MARK 时,charType 必须为 WITH_U_UNICODE,否则异常。
  26. pinyinVCharType = toneType == 2 ? HanyuPinyinVCharType.WITH_U_UNICODE : pinyinVCharType;
  27. char[] textChar = text.trim().toCharArray();
  28. HanyuPinyinOutputFormat hanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
  29. hanyuPinyinOutputFormat.setCaseType(pinyinCaseType);
  30. hanyuPinyinOutputFormat.setToneType(pinyinToneType);
  31. hanyuPinyinOutputFormat.setVCharType(pinyinVCharType);
  32. for (int i = 0; i < textChar.length; i++) {
  33. // 只为汉字进行拼音转换。
  34. if (Character.toString(textChar[i]).matches("[\\u4E00-\\u9FA5]+")) {
  35. /**toHanyuPinyinStringArray
  36. * 获取单个汉字的所有汉语拼音,即对于多音字,如"间",则返回两个汉语拼音串:jian1、jian4
  37. * 这里暂时只取第一个,实际中这样是存在误差的,多音字很容易取错拼音.
  38. */
  39. String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(textChar[i], hanyuPinyinOutputFormat);
  40. String fullPinYin = pinyinStringArray[0];
  41. //caseType 表示将首字母大写
  42. fullPinYin = caseType == 3 ? Character.toString(fullPinYin.charAt(0)).toUpperCase() + fullPinYin.substring(1) : fullPinYin;
  43. result.append(fullPinYin).append(spacer);
  44. } else {
  45. result.append(textChar[i]);
  46. }
  47. }
  48. } catch (BadHanyuPinyinOutputFormatCombination e) {
  49. e.printStackTrace();
  50. }
  51. return result.toString();
  52. }

1、因为其中对于汉字返回的多个拼音只取了第一个,所以对于多音字会出现误差。网上有人的解决方式是将多音字做成一个字典,对于多音字进行比对,可参考:https://www.jianshu.com/p/e0a3ac3521d7

2、对于多音字确实暂时也没有理想的解决办法,即使是网上很多的在线转换工具同样存在这个问题,如:

3、本文演示源码:/src/main/java/com/wmx/apachestudy/pinying/PinYin4jUtil.java

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号