Java中文汉字转拼音

简介: 实现方法多样,在此列举两种,一种是比较简单,但是实现自定义稍差,还有一种就是自己写实现逻辑

一、简述

实现方法多样,在此列举两种,一种是比较简单,但是实现自定义稍差,还有一种就是自己写实现逻辑

二、代码

需要的jar包

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

代码工具类

法一:使用已有的hutool工具类,里面包含了拼音转换的处理。需要搭配pinyin4j包。

import cn.hutool.extra.pinyin.PinyinUtil;
import cn.hutool.extra.pinyin.engine.pinyin4j.Pinyin4jEngine;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;

public class PinyinTest {
    public static void main(String[] args) {
        //简单实现
        String str = PinyinUtil.getPinyin("吕仇","-");
        System.out.println(str);
        //自定义实现
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.UPPERCASE);// 大小写
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不加声调
        format.setVCharType(HanyuPinyinVCharType.WITH_V);// 'ü' 使用 "v" 代替
        Pinyin4jEngine engine = new Pinyin4jEngine(format);

        String pinyin = engine.getPinyin("吕仇", " ");
        System.out.println(pinyin);
    }
}

法二:直接使用pinyin4j包,自己封装一下实现逻辑。其实与hutool工具一样,只不过可以根据项目需求更加灵活。以下就是我写的实现了多音字全部返回。

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;

import java.util.*;

/**
 * @author : ZhiPengyu
 * @ClassName :  [NameUtil]
 * @Description :  [处理中文姓名相关]
 * @CreateDate :  [2021/10/20 16:31]
 */
public class NameUtils {

    /**
     * 中文转拼音(大写,无音标)
     * @param chineseStr
     * @return
     */
    public static Set<String> getAllPinyin(String chineseStr) {
        //输出格式设置
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        /**
         * 输出大小写设置
         *
         * LOWERCASE:输出小写
         * UPPERCASE:输出大写
         */
        format.setCaseType(HanyuPinyinCaseType.UPPERCASE);

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

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

        char[] hanYuArr = chineseStr.trim().toCharArray();
        Set<String> nameSet = new LinkedHashSet<>();
        try {
            for (int i = 0, len = hanYuArr.length; i < len; i++) {
                //匹配是否是汉字
                if (Character.toString(hanYuArr[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    //如果是多音字,返回多个拼音
                    String[] pys = PinyinHelper.toHanyuPinyinStringArray(hanYuArr[i], format);
                    if (nameSet.isEmpty()){
                        nameSet.addAll(Arrays.asList(pys));
                    }else{
                        Set<String> term = new HashSet<>();
                        for(String a1 : nameSet){
                            for(String a2 : pys){
                                term.add(a1+a2);
                            }
                        }
                        nameSet = term;
                    }
                } else {
                    Set<String> term = new HashSet<>();
                    for(String a : nameSet){
                        term.add(a + hanYuArr[i]);
                    }
                    nameSet = term;
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return nameSet;
    }

    private NameUtils() {
    }
}
目录
相关文章
|
6月前
|
Java 容器
idea中关于java的图形化界面编程awt_container容器中Button(按钮)上汉字是乱码或者小方框的解决方法
idea中关于java的图形化界面编程awt_container容器中Button(按钮)上汉字是乱码或者小方框的解决方法
126 0
|
5月前
|
Java
JAVA随机生成一个汉字的方法和代码
JAVA随机生成一个汉字的方法和代码
42 1
|
6月前
|
Java
Java正则表达式去掉非汉字字符
【5月更文挑战第11天】Java正则表达式去掉非汉字字符
122 3
|
6月前
|
Java
Java_获取汉字的汉语拼音首字母Java版(转)
Java_获取汉字的汉语拼音首字母Java版(转)
40 2
|
6月前
|
Java
java实现中文转化为拼音与简称(转)
java实现中文转化为拼音与简称(转)
44 1
|
Java
Java工具类——汉字转拼音
写了一个根据汉字获取拼音字符串的工具类
151 0
|
Java Maven
Java代码获取汉字的拼音或汉字首字母
今天写项目时,有需要将输入的汉字转化为拼音和提取每个汉字首字母的功能,随手记录分享一下
182 0
|
编解码 Java Maven
Java汉字转拼音(解决方案)
Java汉字转拼音(解决方案)
227 0
Java汉字转拼音(解决方案)
如何在Java中将汉字转成汉语拼音
记录下如何在Java中将汉字转成汉语拼音
738 0
如何在Java中将汉字转成汉语拼音