Java 获取中文拼音和首字母

需求:获取中文首字母当做用户登录名。获取用户姓名拼音做其他逻辑。不需要定制化使用hutool封装的PinyinUtil即可,我这里需要自己定制,所以写了个工具类。实现基于搜狐的 Pinyin4j库。

依赖:

<!--hutool-->
		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-all</artifactId>
			<version>5.4.2</version>
		</dependency>
		<dependency>
			<groupId>com.belerweb</groupId>
			<artifactId>pinyin4j</artifactId>
			<version>2.5.1</version>
		</dependency>

PinyinUtils代码示例

PinyinUtils 提供了以下主要方法:
  • toHanYuPinyinString(String str):将字符串转换为汉语拼音,去掉声调。
  • getFirstLetters(String chineseString):获取中文拼音的首字母。
  • getPinyin(String str, String separator):获取中文拼音,可以指定拼音之间的分隔符。
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import lombok.experimental.UtilityClass;
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;

/**
 * 拼音工具类
 * 
 */
@UtilityClass
public class PinyinUtils {

    private final HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();

    static {
        outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
        outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
    }

    /**
     * 汉语转拼音
     * @param str
     * @return
     */
    public String toHanYuPinyinString(String str) {
        try {
            return PinyinHelper.toHanYuPinyinString(str, outputFormat, "", false);
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            return null;
        }
    }

    /**
     * 获取中文拼音首字母
     * @param chineseString
     * @return
     */
    public String getFirstLetters(String chineseString) {
        if (chineseString == null || chineseString.trim().isEmpty()) {
            return null;
        }

        StringBuilder firstLetters = new StringBuilder();
        for (char ch : chineseString.toCharArray()) {
            String pinyin = getPinyin(String.valueOf(ch), "");
            if (!pinyin.isEmpty()) {
                // 获取并添加首字母
                firstLetters.append(pinyin.charAt(0));
            } else {
                // 对于无法转换为拼音的字符(例如数字、英文等),直接添加
                firstLetters.append(ch);
            }
        }

        return firstLetters.toString();
    }

    /**
     * 获取中文拼音
     * @param str
     * @param separator
     * @return
     */
    public String getPinyin(String str,String separator) {
        StrBuilder result = StrUtil.strBuilder();
        boolean isFirst = true;
        int strLen = str.length();

        try {
            for(int i = 0; i < strLen; ++i) {
                if (isFirst) {
                    isFirst = false;
                } else {
                    result.append(separator);
                }

                String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(str.charAt(i), outputFormat);
                if (ArrayUtil.isEmpty(pinyinStringArray)) {
                    result.append(str.charAt(i));
                } else {
                    result.append(pinyinStringArray[0]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination var8) {
            throw new CheckedException(var8);
        }

        return result.toString();
    }



    public static void main(String[] args) {
        String pinyin = toHanYuPinyinString("这是一个测试");
        System.out.println(pinyin);
        String pinyinWithSep = getPinyin("这是一个测试","_");
        System.out.println(pinyinWithSep);
        String firstLetters = getFirstLetters("这是一个测试");
        System.out.println(firstLetters);
    }


}

运行结果:

zheshiyigeceshi
zhe_shi_yi_ge_ce_shi
zsygcs

不管是信神,还是自珍自重,人活在世界上总得有点信念才成。–王小波

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值