PinYin4j汉字转拼音使用及踩坑

1、pinyin4j是啥

pinyin4j 是一个开源的 Java 汉字转拼音库,纯 Java 实现,无额外依赖,支持主流中文汉字转拼音、多音字处理、拼音大小写、声调转换等功能。

2、pinyin4j代码使用

1. 引入依赖

java 复制代码
<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.1</version>
</dependency>

2. 核心工具类

封装好的通用工具类,包含最常用的 4 个功能:

  1. 汉字转全拼(带 / 不带声调)
  2. 汉字转首字母
  3. 多音字处理
  4. 特殊字符过滤
java 复制代码
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;

/**
 * pinyin4j 汉字转拼音工具类
 */
public class PinyinUtils {

    /**
     * 初始化拼音格式化配置(全局复用,无需重复创建)
     */
    private static final HanyuPinyinOutputFormat PINYIN_FORMAT;

    static {
        PINYIN_FORMAT = new HanyuPinyinOutputFormat();
        // 1. 拼音大小写:LOWERCASE小写 / UPPERCASE大写
        PINYIN_FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        // 2. 声调格式:WITHOUT_TONE无声调 / WITH_TONE_NUMBER数字声调 / WITH_TONE_MARK符号声调
        PINYIN_FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        // 3. 特殊拼音ü显示:WITH_U_UNICODE标准格式 / WITH_V用v代替
        PINYIN_FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
    }

    /**
     * 【常用】汉字字符串转全拼(无声调、小写、无空格)
     * 例:中国 -> zhongguo
     */
    public static String toPinyin(String chinese) {
        if (chinese == null || chinese.trim().isEmpty()) {
            return "";
        }
        StringBuilder result = new StringBuilder();
        char[] chars = chinese.toCharArray();

        try {
            for (char c : chars) {
                // 判断是否为汉字
                if (String.valueOf(c).matches("[\\u4e00-\\u9fa5]")) {
                    // 获取拼音(多音字返回数组,默认取第一个)
                    String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
                    if (pinyins != null && pinyins.length > 0) {
                        result.append(pinyins[0]);
                    }
                } else {
                    // 非汉字直接保留(数字、字母、符号等)
                    result.append(c);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return result.toString();
    }

    /**
     * 【常用】汉字字符串转首字母
     * 例:中国 -> zg
     */
    public static String toFirstLetter(String chinese) {
        if (chinese == null || chinese.trim().isEmpty()) {
            return "";
        }
        StringBuilder result = new StringBuilder();
        char[] chars = chinese.toCharArray();

        try {
            for (char c : chars) {
                if (String.valueOf(c).matches("[\\u4e00-\\u9fa5]")) {
                    String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
                    if (pinyins != null && pinyins.length > 0) {
                        // 取首字母
                        result.append(pinyins[0].charAt(0));
                    }
                } else {
                    result.append(c);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return result.toString();
    }

    /**
     * 获取汉字所有拼音(处理多音字)
     * 例:行 -> [xing, hang]
     */
    public static String[] getMultiPinyin(char c) {
        try {
            return PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return null;
    }

}

测试结果

java 复制代码
/**
 * @author TXD
 * @version 1.0   2026-04-27
 */

public class Client {
    public static void main(String[] args) {
        System.out.println(PinyinUtils.toPinyin("我爱Java"));
        System.out.println(PinyinUtils.toFirstLetter("我爱Java"));
        System.out.println(Arrays.toString(PinyinUtils.getMultiPinyin('行')));
    }
}

3. 格式化参数说明(自定义拼音格式)

参数 可选值 效果
大小写 LOWERCASE zhongguo
UPPERCASE ZHONGGUO
声调 WITHOUT_TONE 无声调
WITH_TONE_NUMBER 数字声调:zhong1 guo2
WITH_TONE_MARK 符号声调:zhōng guó
ü 处理 WITH_V 用 v 代替:nv
WITH_U_UNICODE 标准 ü:nü

3、pinyin4j踩坑

作者遇到的问题:如果未设置ü 处理,则默认针对v的处理是向后面拼接冒号

例如:我这边先注释掉对ü的处理

看结果可以发现将冒号拼接到后面了,导致后续的业务失败。。。

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 天前
java函数式编程--入门基础
java·编程·函数式编程