当前位置: 首页 > 工具软件 > pinyin4j > 使用案例 >

关于汉字转拼音的Pinyin4j工具使用

锺离马鲁
2023-12-01

关于汉字转为拼音的相关实现,通常使用Pinyin4j框架,整理一下Pinyin4j的使用

官方文档:

http://pinyin4j.sourceforge.net/

1 Pinyin4j的简介

Pinyin4j 是一个流行的Java开源类库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。

支持功能:

  • 支持简体中文和繁体中文字符
  • 支持转换到汉语拼音,通用拼音
  • 支持多音字,即可以获取一个中文字符的多种发音
  • 支持多种字符串输出格式

应用场景:

  • 用户输入汉字转拼音
  • 数据库中添加姓名的首字母存储

源代码分析:

/* 主要使用中类是: net.sourceforge.pinyin4j.PinyinHelper和net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat

 PinyinHelper对象处理汉语转拼音
 HanyuPinyinOutputFormat对象用于处理汉语拼音输出格式

 PinyinHelper对象相关方法
	toHanyuPinyinStringArray(char ch)
	toHanyuPinyinStringArray(char ch, HanyuPinyinOutputFormat outputFormat)

 HanyuPinyinOutputFormat对象
    setCaseType()方法  设置拼音大小写
   	    HanyuPinyinCaseType.UPPERCASE:大写
    	HanyuPinyinCaseType.LOWERCASE:小写

	setVCharType()方法  设置字符V的显示方式
        HanyuPinyinVCharType.WITH_U_AND_COLON:显示为u:(默认)
        HanyuPinyinVCharType.WITH_V :显示为v
        HanyuPinyinVCharType.WITH_U_UNICODE:显示为ü
        
	setToneType()方法
        HanyuPinyinToneType.WITH_TONE_NUMBER:设置数字声调(默认)
        HanyuPinyinToneType.WITHOUT_TONE:设置不显示声调
        HanyuPinyinToneType.WITH_TONE_MARK:设置显示声调,前提必须设置V如何显示
*/

2 Pinyin4j的使用

1 添加maven依赖

    <dependency>
      <groupId>com.belerweb</groupId>
      <artifactId>pinyin4j</artifactId>
      <version>2.5.1</version>
    </dependency>

2 添加汉字转拼音工具类

@Slf4j
public class PinYinUtils {


    public static void main(String[] args) {
        PinYinUtils pinYinUtils = new PinYinUtils();
        String str = "唐代诗人李白-libai";
        System.out.println(pinYinUtils.toHanyuPinyin(str));
        System.out.println(pinYinUtils.getFirstLetter(str));
    }
    
    /**
     * 汉字转拼音
     */
    public String toHanyuPinyin(String hanzi) {
        char[] chars = hanzi.trim().toCharArray();
        String hanyupinyin = "";

        //输出格式设置
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        /**
         * 输出大小写设置
         *
         * LOWERCASE:输出小写
         * UPPERCASE:输出大写
         */
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

        /**
         * 输出音标设置
         *
         * WITH_TONE_MARK:直接用音标符(必须设置WITH_U_UNICODE,否则会抛出异常)
         * WITH_TONE_NUMBER:1-4数字表示音标
         * WITHOUT_TONE:没有音标
         */
//        defaultFormat.setToneType(HanyuPinyinToneType.WITH_TONE_MARK); //  必须设置WITH_U_UNICODE,否则会抛出异常
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        /**
         * 特殊音标ü设置
         *
         * WITH_V:用v表示ü
         * WITH_U_AND_COLON:用"u:"表示ü
         * WITH_U_UNICODE:直接用ü
         */
//        defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
        defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);

        // 中文的正则表达式
        String hanziRegex = "[\\u4E00-\\u9FA5]+";

        try {
            for (int i = 0; i < chars.length; i++) {
                // 判断为中文,则转换为汉语拼音
                if (String.valueOf(chars[i]).matches(hanziRegex)) {
                    hanyupinyin += PinyinHelper
                            .toHanyuPinyinStringArray(chars[i], defaultFormat)[0];
                } else {
                    // 不为中文,则不转换
                    hanyupinyin += chars[i];
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            log.error("字符不能转成汉语拼音");
        }

        return hanyupinyin;
    }
    /**
     * 取汉字的第一个字符
     */
    public String getFirstLetter(String hanzi) {
        char[] chars = hanzi.trim().toCharArray();
        StringBuilder firstPinyin = new StringBuilder();

        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        // 拼音大写
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        // 不带声调
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        try {
            String str = String.valueOf(chars[0]);
            // 中文的正则表达式
            String hanziRegex = "[\\u4E00-\\u9FA5]+";
            // 数字表达式
            String numberRegex = "[0-9]+";
            // 字母表达式
            String charRegex = "[a-zA-Z]+";

            for (int i = 0, len = chars.length; i < len; i++) {
                // 判断为汉字,则转为拼音,并取第一个字母
                if (Character.toString(chars[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    // 如果是多音字,只取第一个
                    String[] pys = PinyinHelper.toHanyuPinyinStringArray(chars[i], defaultFormat);
                    firstPinyin.append(pys[0].charAt(0));
                } else {
                    firstPinyin.append(chars[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            log.error("字符不能转为汉语拼音");
        }

        return firstPinyin.toString();
    }
}    

/*
	结果:
	tangdaishirenlibai-libai
	TDSRLB-libai

*/
 类似资料: