pengruibin 发表于 2023-7-31 08:58

Java 获取汉字的拼音或汉字首字母

本帖最后由 pengruibin 于 2023-7-31 09:07 编辑

项目中有需要将输入的汉字转化为拼音和提取每个汉字首字母的功能,记录分享一下

1、引入pinyin4j的maven依赖
<dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
</dependency>

2、编写一个拼音处理的工具类
package com.example.mydemo.utils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* 拼音工具类
*/
public class PinYinUtil {

    /**
   * 获取汉字串拼音,英文字符不变
   * @param chinese 汉字串
   * @return 汉语拼音
   */
    public static String getFullSpell(String chinese) {
      StringBuffer pybf = new StringBuffer();
      char[] arr = chinese.toCharArray();
      HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
      defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
      defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
      for (int i = 0; i < arr.length; i++) {
            if (arr > 128) {
                try {
                  pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr, defaultFormat));
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                  e.printStackTrace();
                }
            } else {
                pybf.append(arr);
            }
      }
      return pybf.toString();
    }
   
    /**
   * 获取汉字串拼音首字母,英文字符不变
   * @param chinese 汉字串
   * @return 汉语拼音首字母
   */
    public static String getFirstSpell(String chinese) {
      StringBuffer pybf = new StringBuffer();
      char[] arr = chinese.toCharArray();
      HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
      defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
      defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
      for (int i = 0; i < arr.length; i++) {
            if (arr > 128) {
                try {
                  String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr, defaultFormat);
                  if (temp != null) {
                        pybf.append(temp.charAt(0));
                  }
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                  e.printStackTrace();
                }
            } else {
                pybf.append(arr);
            }
      }
      return pybf.toString().replaceAll("\\W", "").trim();
    }
   

    public static void main(String[] args) {
             System.out.println(getFullSpell("吃饭了吗"));
             System.out.println(getFirstSpell("吃饭了吗"));
   }
}


运行结果

pengruibin 发表于 2023-8-4 09:45

petroyf 发表于 2023-8-3 15:22
是从pinyin4j这个库里获取的常用汉字对应拼音吗?

是的,从pinyin4j依赖库处理的

TinaZerotwo 发表于 2023-7-31 10:49

String不是很好啊,使用String对象进行拼接的话会产生大量的中间对象,造成资源浪费和性能损失。可以使用StringBuilder或StringBuffer

鹿鸣 发表于 2023-7-31 10:42

学习了,感谢分享啦

pengruibin 发表于 2023-7-31 10:58

TinaZerotwo 发表于 2023-7-31 10:49
String不是很好啊,使用String对象进行拼接的话会产生大量的中间对象,造成资源浪费和性能损失。可以使用St ...

额……    StringBuffer 用着呢

weiyanli 发表于 2023-7-31 11:37

有用的知识又增加了,感谢楼主分享 {:1_919:}

shuoyushanhai 发表于 2023-7-31 12:57


学习了,感谢分享啦

抱着丨枕头睡 发表于 2023-7-31 13:56

学习了,收藏一下

x1n 发表于 2023-7-31 14:34

很不错哈哈,学习了{:1_927:}

y72463700 发表于 2023-7-31 21:00

学习了,感谢分享啦

yuaotian 发表于 2023-8-1 02:26

TinaZerotwo 发表于 2023-7-31 10:49
String不是很好啊,使用String对象进行拼接的话会产生大量的中间对象,造成资源浪费和性能损失。可以使用St ...

实际上jvm会自动优化,你放心,我看过字节码文件了,如果你用string进行拼接啥的,编译后自动转成sb的
页: [1] 2 3 4
查看完整版本: Java 获取汉字的拼音或汉字首字母