PinyinUtil.java 1.84 KB
package com.xly.util;

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.exception.BadHanyuPinyinOutputFormatCombination;

public class PinyinUtil {

    private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();

    static {
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);  // 小写
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  // 不带声调
    }

    public static String convertToPinyin(Object input) {
        if (input == null) {
            return "";
        }

        String sVal = input.toString().trim();
        if (sVal.isEmpty()) {
            return "";
        }

        try {
            StringBuilder result = new StringBuilder();
            char[] chars = sVal.toCharArray();

            for (char ch : chars) {
                // 判断是否为汉字
                if (String.valueOf(ch).matches("[\\u4E00-\\u9FA5]+")) {
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(ch, FORMAT);
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        // 多音字取第一个
                        result.append(pinyinArray[0]);
                    } else {
                        result.append(ch);  // 无法转换保留原字符
                    }
                } else {
                    result.append(ch);  // 非汉字直接保留
                }
            }

            return result.toString() + "_";
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            System.err.println("拼音转换异常: " + sVal + ", " + e.getMessage());
            return sVal + "_";
        }
    }
}