pinyin4j 汉字转拼音包括——多音字

一、Maven 依赖

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

二、通过多音字字典匹配

2.1,先看效果效果

输入:我在重庆
返回:wozaichongqing
⚠️:当遇到复杂组合时,不太好使,如:我在隆重庆祝,会返回:wozailongchongqingzhu

2.2,直接上代码

2.2.1,工具类 Pinyin4jUtil

package cn.piesat.space.global.search.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Pinyin4j 工具类
 *
 * @author: wangjing
 * @createTime: 2023-11-27 11:11
 * @version:
 * @Description:
 */
public class Pinyin4jUtil {

    private static Map<String, List<String>> pinyinMap = new HashMap<String, List<String>>();

    /**
     * 静态代码块 -->加载字典文件
     */
    static {
        try {
            // 这是自定义字典文件
            ClassLoader classLoader = Pinyin4jUtil.class.getClassLoader();
            initPinyin(classLoader.getResource("polyphonic_character_dict.txt").getFile());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化 所有的多音字词组
     *
     * @param filePath
     * @throws FileNotFoundException
     * @throws UnsupportedEncodingException
     */
    public static void initPinyin(String filePath) throws FileNotFoundException, UnsupportedEncodingException {
        // 读取多音字的全部拼音表;
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "utf-8");
        BufferedReader br = new BufferedReader(isr);
        String s = null;
        try {
            while ((s = br.readLine()) != null) {
                if (s != null) {
                    String[] arr = s.split("#");
                    String pinyin = arr[0];
                    String chinese = arr[1];
                    if (chinese != null) {
                        String[] strs = chinese.split(" ");
                        List<String> list = Arrays.asList(strs);
                        pinyinMap.put(pinyin, list);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 汉字转汉语拼音
     *
     * @param text            汉语文本
     * @param pinyinCaseType  设置拼音大小写:UPPERCASE(大写)、LOWERCASE(小写)
     * @param pinyinToneType  设置拼音音调:WITHOUT_TONE(无音标)、WITH_TONE_MARK(拼音上面带音标)、WITH_TONE_NUMBER(用1-4表示音调)
     * @param pinyinVCharType 设置特殊音标ü:WITH_V(用 v 表示 ü)、WITH_U_AND_COLON(用 "u:" 表示 ü)、WITH_U_UNICODE(直接用 ü)
     *                        注意:toneType 为 WITH_TONE_MARK 时,charType 必须为 WITH_U_UNICODE,否则异常。
     * @return
     */
    public static String textToHanYuPinyin(String text, HanyuPinyinCaseType pinyinCaseType,
                                           HanyuPinyinToneType pinyinToneType, HanyuPinyinVCharType pinyinVCharType) {
        StringBuffer result = new StringBuffer();
        //将汉字参数去除空格后转化为数组
        char[] textChar = text.trim().toCharArray();
        // 拼音格式配置
        HanyuPinyinOutputFormat hanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
        hanyuPinyinOutputFormat.setCaseType(pinyinCaseType);
        hanyuPinyinOutputFormat.setToneType(pinyinToneType);
        // toneType 为 WITH_TONE_MARK 时,charType 必须为 WITH_U_UNICODE,否则异常。
        if (pinyinToneType.equals(HanyuPinyinToneType.WITH_TONE_MARK)) {
            pinyinVCharType = HanyuPinyinVCharType.WITH_U_UNICODE;
        }
        hanyuPinyinOutputFormat.setVCharType(pinyinVCharType);
        try {
            for (int i = 0; i < textChar.length; i++) {
                // 只为汉字进行拼音转换。
                char ch = textChar[i];
                if (Character.toString(ch).matches("[\\u4E00-\\u9FA5]+")) {
                    /**
                     * toHanyuPinyinStringArray
                     * 获取单个汉字的所有汉语拼音,即对于多音字,如"重",则返回两个汉语拼音串:zhong、chong
                     * 这里暂时只取第一个,实际中这样是存在误差的,多音字很容易取错拼音.
                     */
                    String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(ch,
                            hanyuPinyinOutputFormat);

                    String fullPinYin = pinyinStringArray[0];

                    // 多音字
                    if (pinyinStringArray.length != 1 && !pinyinStringArray[0].equals(pinyinStringArray[1])) {
                        String polyphonicCharacterHandleResult = polyphonicCharacterHandle(text, pinyinStringArray, i
                                , ch);
                        if (StringUtils.isNotBlank(polyphonicCharacterHandleResult)) {
                            fullPinYin = polyphonicCharacterHandleResult;
                        }
                    }
                    result.append(fullPinYin);
                } else {
                    result.append(ch);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return result.toString();
    }

    /**
     * 多音字处理
     *
     * @param text
     * @param pinyinStringArray
     * @param i
     * @return
     */
    public static String polyphonicCharacterHandle(String text, String[] pinyinStringArray, int i, char ch) {
        // 最终结果
        String result = "";
        // 多音字共有几个音
        int pinyinStringArrayLenth = pinyinStringArray.length;
        // 文本长度
        int textLength = text.length();

        String s = null;

        List<String> keyList = null;
        for (int x = 0; x < pinyinStringArrayLenth; x++) {
            String py = pinyinStringArray[x];
            // 过滤 u:
            if (py.contains("u:")) {
                py = py.replace("u:", "v");
            }
            keyList = pinyinMap.get(py);

            // 后向匹配2个汉字
            if (i + 3 <= textLength) {
                s = text.substring(i, i + 3);
                if (keyList != null && (keyList.contains(s))) {
                    result = py;
                    break;
                }
            }

            // 后向匹配 1个汉字
            if (i + 2 <= textLength) {
                s = text.substring(i, i + 2);
                if (keyList != null && (keyList.contains(s))) {
                    result = py;
                    break;
                }
            }

            // 前向匹配2个汉字
            if ((i - 2 >= 0) && (i + 1 <= textLength)) {
                s = text.substring(i - 2, i + 1);
                if (keyList != null && (keyList.contains(s))) {
                    result = py;
                    break;
                }
            }

            // 前向匹配1个汉字
            if ((i - 1 >= 0) && (i + 1 <= textLength)) {
                s = text.substring(i - 1, i + 1);
                if (keyList != null && (keyList.contains(s))) {
                    result = py;
                    break;
                }
            }

            // 前向1个,后向1个
            if ((i - 1 >= 0) && (i + 2 <= textLength)) {
                s = text.substring(i - 1, i + 2);
                if (keyList != null && (keyList.contains(s))) {
                    result = py;
                    break;
                }
            }
        }
        return result;
    }


    public static void main(String[] args) {
        String test = textToHanYuPinyin("我在重庆", HanyuPinyinCaseType.LOWERCASE, HanyuPinyinToneType.WITHOUT_TONE,
                HanyuPinyinVCharType.WITH_U_AND_COLON);
        System.out.println(test);
    }


}

2.2.2,字典文件:polyphonic_character_dict.txt 放到 resources 目录下

a#阿 阿姨 阿富 阿门 阿拉 阿林  黑阿  麦阿密 鹿城阿岙 阿福
ao#拗口 违拗 凹
ai#艾 艾滋 艾蒿 未艾
bang#膀 翅膀 臂膀 重磅 磅秤 黄泥磅店 蛤蚌 蚌壳 河蚌 鹬蚌 珠蚌 蚌
ba#扒
bai#叔伯 百 百万  柏
bao#剥皮 薄 超薄 薄脆 薄板 薄饼  暴 暴晒 暴发 暴雨 暴力 风暴  暴露 暴风  汉堡 古堡 地堡 城堡 龍堡 卡斯堡  麻家堡 麦芬堡 汉堡 麦得堡  麦尔堡  曝光 瀑河
beng#蚌埠
bi#复辟  臂 臂章 螳臂 交臂 前臂 一臂 奋臂 膀臂 臂膀 秘鲁 泌阳
bing#屏弃 屏气 屏除 屏退 屏息
bian#扁 扁桃 便 方便 方便面 便当 便捷
bo#薄 薄荷 单薄 伯 伯仲 伯乐 伯劳 伯父 大伯 老伯 伯母 黄伯 伯爵 停泊 淡泊 尼泊 漂泊 波 鸿波 柏林
bu#大埔
can#参 参谋 参事 总参 参数 参议 参观 参拜 参股
cang#藏 埋藏 藏头 秘藏  雪藏 藏匿 收藏 馆藏 矿藏 隐藏  蕴藏 藏袍 储藏 窖藏 藏龙  藏胞 冷藏 珍藏 私藏 藏掖 西藏 藏书 藏品 伧俗  伧 龙藏寺
cen#参差
ceng#曾 不曾 似曾 几曾 何曾 曾经 曾几 未曾 噌  噌的 一声
cha#差  刹那 宝刹 一刹  喳喳
chai#公差 差役 专差 官差 听差 美差 办差 差事 差使 肥差 当差 钦差
chan#颤 颤悠  单于 禅 禅学 班禅 禅宗 禅堂 禅门 禅机 禅杖 禅房 禅师 坐禅 参禅 禅院
chang#长 周长 细长 长发 三长 长河 长袖 长衫 天长 长短 超长 长沙 长春 长远 长度 长江 长处 长假  长街 长征 全长 长城 波长  身长 长途 长吁 长虹 长方  厂
chao#朝 朝阳 朝阳区 朝鲜 朝廷 王朝 历朝 解嘲 讥嘲 自嘲 嘲笑 嘲弄 冷嘲 嘲讽 绰绰 绰起 绰家 剿袭 剿说
che#车 汽车 停车场 车车  黑车 车饰
chen#称职 匀称 称心 相称 对称
cheng#称 职称 简称 总称 官称 代称 称号 称谓  昵称 谦称 全称 名称  乘 噌吰 澄
chu#六畜 家畜 耕畜 畜生 牲畜
chui#椎心
chuan#传 文传 传媒 传销 传情 真传 祖传 传闻 传家 秘传 传单 传说
chi#匙子 茶匙 羹匙 汤匙 尺 尺度 英尺 咫尺 尺码 公尺 卡尺 米尺 卷尺
chong#重庆 重重
chou#臭 汗臭 臭氧 口臭 腋臭 臭虫 臭骂 臭美 酸臭 腐臭 臭气 腥臭 臭名 遗臭 恶臭 臭豆 狐臭 臭味 臭架
chuang#经幢
chuo#绰 绰约 阔绰 绰号 宽绰
ci#参差 伺候 龟兹
cuan#攒钱 攒聚 攒动
cuo#撮儿 撮要 撮合
da#大 大街 沓子 龙大 大西洋 大昌  大圣 福大 黑大 大华 大包  大厦
dao#叨 叨唠 絮叨 叨念 叨咕 念叨 唠叨 叨叨 磨叨
dai#大夫
dan#单 西单 东单 清单 报单 单利 名单 单姓 单亲 单线 单科 单间 单挑 单价 单词  子弹
de#的 似的 总的 中的 别的
deng#澄清
di#怎的 无的 有的 目的 标的 打的 的确 的当 的士 上地 大地 天地 提防 堤
diao#调 蓝调 蓝调吧 调调 音调 论调 格调 调令 低调 笔调 基调 强调 声调 滥调 老调 色调 单调 腔调 跑调 曲调 步调 语调 主调 情调
du#都 都会 国都 都城 古都 故都 大都 首都 成都 旧都 都市 龙都  鼎都 鹤都 鹏都 鸿都  麦度 度 态度 读书 法度 宽度 进度
dui#堆
dou#全都 句读
duo#测度 忖度 揣度 猜度 舵
dun#粮囤 顿
e#阿谀 阿胶 阿弥 恶心
er#儿
fan#番 番茄 繁
fo#佛 佛塔 佛徒 佛牙 佛教
fu#仿佛 果脯
fou#否 是否 与否
ga#咖 咖喱 伽马
gai#盖
gang#扛鼎
ge#革 革命  皮革  鹰革  蛤蚧 文蛤 蛤蜊 咯吱 咯噔 咯咯
gei#给
geng#脖颈
gong#女红
gu#谷 布谷 谷物 谷地 硅谷 中鹄  麦谷 麓谷 鹭谷 鼓
gui#龟 龟山 龟士 龟博 龟仔 鹿龟  龟汁 龟苓 龟顶
gua#挺括 顶呱 呱呱 呱唧 呱嗒 呱
guan#纶巾 东莞
guang#广 广州 广东 广播
ha#蛤蟆 癞蛤 虾蟆
hai#还是 还有 咳
hao#貉子 貉绒
hang#总行 分行 支行 行业 排行 行情 央行 商行 外行 银行 商行 酒行 麻行 琴行 巷道 珩
he#和 嘉和 和睦 亲和  龙和  之貉 威吓 恫吓 恐吓 鼎和  锦和 麒和苑 合 合资 鸿合
heng#道行
hu#鹄 鹄望 鸿鹄 鹄立
huan#还 鹂还
hui#会 会馆 会展 会所 协会 国会 会堂
hong#红 红装 红牌  红木 红人 虹
huo#软和 热和 暖和
ji#病革 给养 自给 给水 薪给 给予 供给 稽考 稽查 稽核 滑稽 稽留 缉获 缉查 缉私 缉捕 狼藉 奇数 亟  亟待 亟须 亟亟 亟需 诘屈 荠菜
jia#雪茄 伽  瑜伽 伽利略 家
jian#见 龙见
jiang#降 降温 降低 降旗 下降 倔强
jiao#嚼舌 嚼子 细嚼 角 平角 视角 海角 龙角 鹿角  围剿 征剿 饺 饺子 脚
jie#解 解放 慰藉 蕴藉 盘诘 诘难 诘问 反诘 桔
jin#矜 矜夸 矜持 骄矜 自矜 劲
jing#颈 颈项 颈椎 引颈 长颈 宫颈 瓶颈 龙颈  黑颈鹤 鹿颈  景 景色 帝景 劲松
ju#咀 咀嚼  居  桔汁
jun#均 平均 鸿均
juan#棚圈 圈养
jv#咀嚼 趑趄
jvan#猪圈 羊圈
jue#主角 角色 旦角 女角 丑角 角力 名角 配角 咀嚼 觉 直觉 感觉 错觉 触觉 幻觉 堀
jun#龟裂 俊
jvn#龟裂
ka#咖啡 卡 磁卡  贺卡 卡拉 胸卡 声卡 卡片  绿卡 卡通  网卡 卡口  龙卡  咯痰 咯血 喀
kang#扛
ke#咳 咳嗽 干咳 贝壳 蚌壳 外壳 蛋壳 脑壳 弹壳
keng#吭声 吭气 吭哧
kuai#会计 财会
kuo#括
la#癞痢 腊
lai#癞疮 癞子 癞蛤 癞皮
lao#积潦 络子 落枕 落价 麻粩
le#乐 娱乐 玩乐 乐趣  美乐 乐缘  勒  了
lei#勒紧
lo#然咯
lou#佝偻
long#里弄 弄堂 泷
li#礼 豊 栎
liao#了解 了结  明了 了得 末了 未了 了如  了如指掌 潦草 潦倒
liang#靓
liu#碌碡  碌碌 劳碌 忙碌 庸碌 六
lu#绿林 碌
luo#络 络腮 落 部落 落花 日落
lv#率 频率 机率 比率 效率 胜率 概率 汇率 功率 倍率 绿 绿叶 淡绿 绿色 绿豆 伛偻  绿洲
lun#丙纶 锦纶 经纶 涤纶
mai#埋
man#埋怨 蔓
mai#脉 山脉 动脉 命脉 筋脉 脉象 气脉 脉动 脉息 脉络 一脉 经脉
mang#氓 流氓
me#黛么
meng#群氓 盟
mei#没
mo#埋没 隐没 脉脉 模 航模 模糊 男模 楷模 规模 劳模 模型 模范 模特 名模  摩 么 麼 麽
mou#绸缪
mi#秘 秘密 秘方 奥秘 神秘 泌尿 分泌
miu#谬 谬论 纰缪
mu#人模 字模 模板 模样 模具 装模 装模做样 模子
na#哪 娜 安娜 娜娜 丽娜 黛尔娜 黛娜  海娜 黑娜 黄丽娜 麦香娜  优娜 麦娜 麟娜  那
nan#南 南方 湖南
ne#哪吒 呢
nong#弄
ni#毛呢 花呢 呢绒 线呢 呢料 呢子 呢喃 溺
niao#便溺 尿
nian#粘
niu#执拗 拗不
nue#疟 疟疾
nuo#婀娜 袅娜
nv#女 女人
nve#疟原 疟蚊
pa#扒
pai#迫击 迫击炮 派
pao#刨 炮
pang#膀胱 膀肿 磅礴
pi#否极 臧否 龙陂 黄陂
pian#扁舟 便宜
piao#朴姓
ping#屏  屏幕 荧屏 银屏
po#泊 迫 朴刀 坡 陂
pu#暴十 一曝十寒 里堡 十里堡 胸脯 肉脯 脯子 杏脯 简朴 朴质 古朴 朴厚 纯朴 朴素 诚朴 俭朴 朴实 淳朴 曝晒 瀑布 飞瀑 埔 黄埔
qiu#龟兹
qi#稽首 缉鞋 栖 奇 奇妙 传奇 亟来 荸荠 蹊跷  林栖  鹿奇 鹭奇 漆 齐 齐天大圣 齐天 其
qia#卡脖 卡子 关卡 卡壳 哨卡 边卡 发卡
qiao#雀盲 雀子 地壳 甲壳 躯壳
qian#纤手 拉纤 纤夫 纤绳 乾
qiang#强颜  强人 自强 强烈 强风 强大 黎强 麒强 鹤强 龚强
qie#茄子 颠茄 番茄 趔趄
qin#亲 亲和 亲亲 棘矜 矜锄
qing#干亲 亲家 黥
qu#区 小区
quan#转圈 钢圈 圆圈 罗圈 弧圈 垫圈 小圈 眼圈
que#雀 麻雀 鸟雀 燕雀 孔雀 云雀 雀巢、
re#般若
ruo#若
sai#塞 麦迪塞姆 活塞
se#堵塞 搪塞 茅塞 闭塞 鼻塞 梗塞 阻塞 淤塞 拥塞 哽塞 月色 彩色 特色 深色 声色 黛色  黛色 黑色瞳 色坊
sha#刹车 急刹 急刹车 厦  广厦 大厦 商厦 鹰大厦  莎
shai#色子
shan#姓单 单县  杉 铁杉 杉树 封禅 禅让 黒杉  栅
shang#裳 衣裳
she#拾级 折本
shen#沙参 野参 参王 人参 红参 丹参 山参 海参 刺参 没什 什么 为什 鹿参 身
sheng#野乘 千乘 史乘  省 晟 盛 盛大 鸿盛
shi#钥匙 拾荒 捡拾 拾物 家什 什物 什锦 麻什  麦什 喀什 牛什  识  见识 知识 似的 骨殖 食 饮食 副食  石 石业 石头 石艺 氏 姓氏 上栅 下栅
shuai#表率 率性 率直 率真 粗率 率领 轻率 直率 草率 大率 坦率 数字 招数 基数 数码
shuang#泷水
shu#属 金属 气数 岁数 度数 数据 级数 数控 数学 参数 次数 正数 代数 实数 系数 分数 辈数
shui#游说
shuo#数见 数见不鲜 传说 听说 妄说 实说  胡说 评说 分说 小说
si#窥伺 伺弄 伺机 疑似 似是 好似 似曾 形似 酷似 貌似 似懂 胜似 恰似 近似 神似 赛似 看似 活似 强似 似乎 类似 相似 思
su#宿主 宿命 归宿 住宿 借宿 寄宿 宿营 夜宿 露宿 投宿 宿舍 名宿 整宿 食宿
sui#尿泡
ta#拓本 拓片 碑拓 疲沓 拖沓 杂沓 沓 塔 鸿塔
tang#汤 鸭汤 鸡汤
tao#叨扰 叨光 陶 陶器
tan#弹性 弹力 反弹
ti#手提 提速 提意 提前 提早 提升 提议 提款 提婚 提包 耳提 提供 麦麦提 体
tiao#空调 调教 烹调 调羹 调料 调皮  调控 调节 调整 调价 谐调  协调 调色 调侃 调味 失调 调治 调频 调剂 调停 调休 调解
ting#町 域町 听
tong#垌
tui#褪色 褪毛
tuo#拓 拓宽 拓荒 开拓 落拓 拓展 拓印
tun#屯 囤积 囤聚
wei#尾 响尾 尾巴 尾灯 船尾 追尾 尾椎 月尾  燕尾 尾数 年尾 岁尾 鸢尾 凤尾 彗尾 尾翼 结尾 遗之 龙尾  齐鑫尾 麻尾 麦度 鹿尾
wu#可恶 交恶 好恶 厌恶 憎恶 嫌恶 痛恶 深恶
wan#藤蔓 枝蔓 瓜蔓 蔓儿  莞尔 万 百万 萬
xia#虾 虾仁 青虾 大虾 虾皮 对虾 虾子 虾酱 虾兵 虾米 龙虾 噶厦 厦门 吓唬 吓人 惊吓 天虾 龙虾 皮皮虾 麦虾
xi#栖栖 系 关系 星系 水系 系念 体系 联系 系列 菜系 世系  蹊 蹊径 溪 洗
xiao#校 学校 切削 削面 刀削 刮削
xian#纤细 光纤 纤巧 纤柔 纤小 纤维 纤瘦 纤纤 化纤 纤秀 棉纤 纤尘
xiang#巷 街巷 僻巷 巷子 龙门巷 六巷 龙湾巷 龙港巷 龙泉巷 龙巷 龙妙巷 龄巷 齐家巷 鼓楼巷 鼓巷 黎明巷 麻子巷 麻园巷 麦子巷 鹊巷
xie#解数 出血 采血 换血 血糊 尿血 淤血 放血 血晕 血淋 便血 吐血 咯血 叶韵 蝎 蝎子
xiu#铜臭 乳臭 成宿 星宿
xin#馨 信 鸿信
xing#深省 省视 内省 不省人事 省悟 省察 行 旅行 例行 行程 行乐 龙行 人行 流行 先行 行星 品行  发行 行政 风行 龙行 龍行 麟行
xu#牧畜 畜产 畜牧 畜养 吁 气吁 喘吁 吁吁 麦埂圩
xue#削 削减 削弱  削瘦 削球 削平 削价 瘦削 剥削 削职  删削 削肩  血 吸血
xun#荨 荨麻 荨麻疹
ya#芽
yao#发疟 疟子 约斤 称约 钥匙 金钥 耀
yan#吞咽 咽气 咽喉  殷红 腌 腌制 腌肉 腌菜 烟 烟草 名烟 烟酒
ye#抽咽 哽咽 咽炎 下咽 呜咽 幽咽 悲咽 叶 绿叶 叶子 荷叶 落叶 菜叶 红叶 树叶 枫叶  茶叶 葉 鸿葉  液
yi#自艾 惩艾 后尾 遗  屹
yin#殷 殷勤 殷墟 殷切 殷鉴
yo#杭育
yu#谷浑 呼吁 吁请 吁求 育 体育 教育 育儿 熨帖 熨烫 於
yuan#员
yun#熨 熨斗 电熨斗
yue#乐音 器乐 乐律 乐章 音乐 乐理 民乐 乐队 声乐 奏乐 弦乐 乐坛 管乐 配乐 乐曲 乐谱  锁钥 密钥 乐团 鼓乐社 乐器 栎阳 约 约会
zan#积攒
zang#宝藏 藏历 藏文 藏香 藏语 藏青 藏族 藏医 藏戏 藏药 藏蓝 蔵
ze#择 择善
zeng#曾孙 曾祖
za#绑扎 结扎 包扎 捆扎
zai#牛仔 龟仔 龙仔 鼻仔 羊仔  仔仔 麻仔  麵包仔 麦旺仔 鸿仔 煲仔 福仔
zha#扎 马扎 挣扎 扎啤 扎根 扎手 扎针 扎花 扎堆 扎营 扎实 稳扎 柞水 麻扎镇 麻扎乡 喳 栅栏
zhai#择菜
zhan#不粘 粘贴 粘连
zhao#朝朝 明朝 朝晖 朝夕 朝思 有朝 今朝 朝气 朝三 朝秦 朝霞 鹰爪 龙爪 魔爪 爪牙 失着 着数 龙爪槐
zhe#折 破折 打折 叠 曲折 折冲 存折  折合 折旧 折纸 骨折 折返 折价 折算 波折 折扇 对折 不折 折扣 七折 折中 拙著 要著 著文 新著 着 本着 对着
zhi#标识 嘎吱 咯吱 吱扭 吱吱 繁殖 增殖 养 生殖 殖民 枝
zhong#重 重量 鹏重 种
zhou#粥
zhu#属意 著录 撰著 名著 专著 著述 著作 显著 昭著 原著 著名 著书 遗著 论著 著者 编著 卓著 译著 著称
zhua#爪
zhui#椎 椎骨 尾椎 椎间 腰椎 胸椎 颈椎 脊椎
zhuo#执著 着装 着落 着意 着力 附着 着笔 胶着 着手 着重 穿着 衣着 执着 着眼 着墨 着实 沉着 着陆 着想 着色
zhuang#幢房 一幢 幢楼
zi#吱声 兹 来兹 今兹 仔细 仔猪
zu#足 沐足 足道
zuo#撮毛 小撮 柞绸 柞蚕 柞树 柞木
zui#咀唇 尖沙咀 黄达咀 黄土咀 鹰咀

三、多音字组合成数组返回

3.1,先看效果

输入:我在重庆
返回:wozaichongqing    wozaizhongqing

3.2,工具类 Pinyin4jUtil2

package cn.piesat.space.global.search.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.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Pinyin4j 工具类
 *
 * @author: wangjing
 * @createTime: 2023-11-27 11:11
 * @version:
 * @Description:
 */
public class Pinyin4jUtil2 {

    /**
     * 汉字转拼音(多音字)+首字母
     *
     * @param chinese 汉字
     * @return 拼音
     */
    /**
     * 汉字转汉语拼音
     *
     * @param text            汉语文本
     * @param pinyinCaseType  设置拼音大小写:UPPERCASE(大写)、LOWERCASE(小写)
     * @param pinyinToneType  设置拼音音调:WITHOUT_TONE(无音标)、WITH_TONE_MARK(拼音上面带音标)、WITH_TONE_NUMBER(用1-4表示音调)
     * @param pinyinVCharType 设置特殊音标ü:WITH_V(用 v 表示 ü)、WITH_U_AND_COLON(用 "u:" 表示 ü)、WITH_U_UNICODE(直接用 ü)
     *                        注意:toneType 为 WITH_TONE_MARK 时,charType 必须为 WITH_U_UNICODE,否则异常。
     * @return
     */
    public static List<String> textToHanYuPinyin(String text, HanyuPinyinCaseType pinyinCaseType,
                                                 HanyuPinyinToneType pinyinToneType,
                                                 HanyuPinyinVCharType pinyinVCharType) {
        //将汉字参数去除空格后转化为数组
        char[] textChar = text.trim().toCharArray();
        // 拼音格式配置
        HanyuPinyinOutputFormat hanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
        hanyuPinyinOutputFormat.setCaseType(pinyinCaseType);
        hanyuPinyinOutputFormat.setToneType(pinyinToneType);
        // toneType 为 WITH_TONE_MARK 时,charType 必须为 WITH_U_UNICODE,否则异常。
        if (pinyinToneType.equals(HanyuPinyinToneType.WITH_TONE_MARK)) {
            pinyinVCharType = HanyuPinyinVCharType.WITH_U_UNICODE;
        }
        hanyuPinyinOutputFormat.setVCharType(pinyinVCharType);

        ArrayList<StringBuilder> sbs = new ArrayList<>();
        ArrayList<StringBuilder> shortSbs = new ArrayList<>();
        sbs.add(new StringBuilder());
        HashSet<String> set = new HashSet<>();
        try {
            for (char value : textChar) {
                ArrayList<StringBuilder> builders = new ArrayList<>(sbs);
                sbs.clear();
                shortSbs.clear();
                //判断是否是汉字
                if (Character.toString(value).matches("[\\u4E00-\\u9FA5]+")) {
                    //如果是多音字,返回多个拼音的数组
                    String[] pys = PinyinHelper.toHanyuPinyinStringArray(value, hanyuPinyinOutputFormat);
                    for (String py : pys) {
                        for (StringBuilder builder : builders) {
                            StringBuilder stringBuilder = new StringBuilder(builder);
                            stringBuilder.append(py);
                            if (!set.contains(stringBuilder.toString())) {
                                sbs.add(stringBuilder);
                                set.add(stringBuilder.toString());
                            }
                        }
                    }
                }
            }

        } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
            badHanyuPinyinOutputFormatCombination.printStackTrace();
        }
        return sbs.stream().map(StringBuilder::toString).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        List<String> list = textToHanYuPinyin("我在重庆", HanyuPinyinCaseType.LOWERCASE, HanyuPinyinToneType.WITHOUT_TONE,
                HanyuPinyinVCharType.WITH_U_AND_COLON);
        for (String str : list) {
            System.out.println(str);
        }
    }

}

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/193530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前缀和与差分

文章目录 前缀和一维前缀和公式CODE 二维前缀和公式CODE 差分一维差分思路作用CODE 二维差分思路CODE 前缀和 一维前缀和 板子题&#xff1a;https://www.acwing.com/activity/content/problem/content/829/ 公式 S [ i ] a [ i ] S [ i − 1 ] S[i] a[i] S[i - 1] S[i]…

大数据Doris(三十):删除数据(Delete)

文章目录 删除数据(Delete) 一、​​​​​​​DELETE FROM Statement(条件删除)

【Cmake】Cmake基础学习

CMake学习 一、基础学习 1. 利用Cmake进行单个源代码构建可执行文件 (1)基础命令 最基本的 CMake项目是由单个源代码文件构建的可执行文件。对于这样的简单项目,只需要一个包含三个命令的 CMakeLists.txt 文件。 注意: 虽然 CMake 支持大写、小写和混合大小写命令,但是…

矩阵置零[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个m x n的矩阵&#xff0c;如果一个元素为0&#xff0c;则将其所在行和列的所有元素都设为0。请使用原地算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[…

[C++]六大默认成员函数详解

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …

【VUE】There are multiple modules with names that only differ in casing.

报错 There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing. Compare these module identifiers: 图示原因&#xff1a;大小写&#xff0c;有…

C#——多线程之异步调用容易出现的问题

C#——多线程之异步调用容易出现的问题 Q1&#xff1a;For中异步调用函数且函数输入具有实时性 Q1&#xff1a;For中异步调用函数且函数输入具有实时性 在项目进行过程中&#xff0c;发现For中用异步调用带有输入参数的函数时&#xff0c;会由于闭包特性&#xff0c;以及Task.…

ELK----日志分析

ELK相关知识 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 E&#xff1a;ElasticSearch &#xff08;ES&#xff09; ES是…

C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

C/C++ 常用加密与解密算法

计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性&#xff0c;常常需要使用加密和解密算法。C是一种广泛使用的编程语言&#xff0c;提供了许多加密和解密算法的实现。本文将介绍一些在C中常用的加密与解密算法&#xff0c;这其中包括Xo…

力扣373场周赛题解

第一题&#xff1a; 这个题是一个简单题&#xff0c;数据范围也特别小&#xff0c;所以直接使用模拟方式暴力解答。 直接进行行移动的过程&#xff0c;然后检查移动后的结果是否与移动前相同。 代码&#xff1a; ​ public class Solution {// 将指定行循环右移k次pri…

OpenCV完结篇——计算机视觉(人脸识别 || 车牌识别)

文章目录 Haar人脸识别方法Haar识别眼鼻口HaarTesseract进行车牌识别深度学习基础知识dnn实现图像分类 Haar人脸识别方法 scaleFactor调整哈尔级联器的人脸选框使其能框住人脸 官方教程指路 每个特征都是通过从黑色矩形下的像素总和减去白色矩形下的像素总和获得的单个值 级…

排序篇(六)----排序小结(不用三连,混流量券)

排序篇(六)----排序小结 排序算法复杂度及稳定性分析 直接插入排序的算法复杂度&#xff1a; 最好情况下&#xff0c;当数组已经有序时&#xff0c;直接插入排序的时间复杂度为O(n)&#xff0c;其中n是数组的大小。最坏情况下&#xff0c;当数组逆序排列时&#xff0c;直接插…

解析实人认证API的工作原理与应用场景

引言 随着数字化时代的不断发展&#xff0c;实人认证技术在各个领域中发挥着越来越重要的作用。其中&#xff0c;实人认证API作为一种先进的技术手段&#xff0c;通过输入姓名、身份证号码和一张人脸照片&#xff0c;与公安库身份证头像进行权威比对&#xff0c;从而返回比对分…

生物神经系统的基本原理 神经元Neuron

生物神经系统的基本原理涉及一系列复杂的生物学和生理学机制&#xff0c;主要可以分为以下几个方面&#xff1a; 神经元与突触&#xff1a;神经系统的基本单位是神经元&#xff0c;它们通过突触连接彼此。神经元接收并处理来自身体其他部分或环境的信息&#xff0c;然后通过电信…

FFmpeg零基础学习(二)——视频文件信息获取

目录 前言正文一、获取宽高信息1、核心代码2、AVFormatContext3、avformat_alloc_context4、avformat_open_input5、avformat_find_stream_info6、av_dump_format7、av_find_best_stream End、遇到的问题1、Qt Debug模式avformat_alloc_context 无法分配对象&#xff0c;而Rele…

【SQL Server Management】使用手册

目录 ⛳️【SQL Server Management】 ⛳️1. 启动登录 ⛳️2. 忘记密码 ⛳️3. 操作数据库和表 3.1 新建数据库text 3.2 新建表 3.3 编辑表 3.4 编写脚本 ⛳️【SQL Server Management】 ⛳️1. 启动登录 需要开启服务 ⛳️2. 忘记密码 登录windows--> 安全性 -->…

VMware虚拟机安装华为OpenEuler欧拉系统

首先去欧拉官方网站下载openEuler的安装镜像&#xff1a; openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 我下载的是最新的23.03长期维护版本&#xff0c;架构选择x86_64。 创建新虚拟机&#xff1a;选择典型配置&#xff0c;点击下一步&#xff1a;选择下载的镜像文…

如何在手机上打开电脑端本地的网页

目录 一.手机端预览VSCode生成的网页站点二.手机端预览VS2022生成的 WebApi网页站点三.总结 今天遇到了2个小问题&#xff1a;1.想在手机上运行VSCode上写好的网页代码。2.同样在手机上运行VS2022 WebApi生成的网页。查找了一晚上资料&#xff0c;终于动手解决了&#xff0c;记…

虽不想承认,但这就是CSGO游戏搬砖行业的现状

其实整个搬砖市场&#xff0c;现在已经变得乌烟瘴气&#xff0c;散发着“恶臭”。童话个人非常鄙视那些虚有其表&#xff0c;大小通吃的做法&#xff0c;那些甚至连搬砖数据都看不懂的人&#xff0c;也出来吹嘘着“实力强大&#xff0c;经验丰富”。这个世界太浮躁了&#xff0…