PinYin4j库的使用

news2024/12/25 9:31:20

一、PinYin4j库简介

1、PinYin4j简介

Pinyin4j 是一个流行的 Java 库,支持汉字和大多数流行的拼音系统之间的转换(汉语拼音,罗马拼音等)。可自定义拼音输出格式,功能强大。

官网地址:http://pinyin4j.sourceforge.net/
在线文档:http://pinyin4j.sourceforge.net/pinyin4j-doc/

2、Pinyin4j支持方式:

  • 支持简体中文和繁体中文字符。
  • 支持转换到汉语拼音,通用拼音,威妥玛拼音(威玛拼法),注音符号第二式,耶鲁拼法和国语罗马字母。
  • 支持多音字,即可以获取一个中文字符的多种发音。
  • 支持多种字符串输出格式,比如支持Unicode格式的字符ü和声调符号(阴平ˉ”,阳平"ˊ",上声"ˇ",去声"ˋ")的输出。

3、Pinyin4j支持多种格式:

Pinyin4j 提供了几个实用程序函数,用于将中文字符(简体和繁体)转换为各种中文罗马化表示。

  • HanyuPinyinOutputFormat:这个类定义了如何输出汉语拼音。
  • HanyuPinyinCaseType:为汉语拼音字符串的输出案例提供了几种选项。
  • HanyuPinyinToneType:该类提供了几种输出中文音调的选项。
  • HanyuPinyinVCharType:这个类为’ü’的输出提供了几个选项。

4、单元测试可以操作一下这几个方法:

引入依赖:

        <!--        pinyin4j-->
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>
    /**
     * 测试 pinyin4j库原生方法
     * @param chinese
     */
    private static void testPinyin4j(String chinese) {
        char[] arr = "汉语".toCharArray();

        HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
        pinyinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        pinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        try {
            System.out.println("toHanYuPinyinString -> " + PinyinHelper.toHanYuPinyinString(chinese, pinyinOutputFormat, "", true));
            // 取第一个
            System.out.println("toHanyuPinyinStringArray -> " + PinyinHelper.toHanyuPinyinStringArray(arr[0], pinyinOutputFormat)[0].charAt(0));
            System.out.println("toHanyuPinyinStringArray -> " + PinyinHelper.toHanyuPinyinStringArray(arr[0])[0].charAt(0));
            System.out.println("toTongyongPinyinStringArray -> " + PinyinHelper.toTongyongPinyinStringArray(arr[0])[0].charAt(0));
            System.out.println("toYalePinyinStringArray -> " + PinyinHelper.toYalePinyinStringArray(arr[0])[0].charAt(0));
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }

    }

二、Pinyin4jUtil工具类

在项目中经常会遇到用户输入汉字后转换为拼音的需求场景,这时候Pinyin4j就派上用场了。

上一篇Java对中文进行排序使用到了它:https://blog.csdn.net/qq_42402854/article/details/127633147

下面创建一个Pinyin4jUtil工具类,来封装几个常用的方法。

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 Pinyin4jUtil {

    /**
     * 获取中文串转汉语全拼。(支持多音字,英文字符和特殊字符都丢弃。)
     *
     * @param str 字符串,为null,返回“”
     * @return 汉语全拼
     */
    public static String getFullSpell(String str) {
        String fullPinyin = "";
        if (str == null) {
            return fullPinyin;
        }

        HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
        /**
         * 定义汉语拼音字符串的输出大小写:
         * LOWERCASE(默认) - 表示汉语拼音作为大写字母输出
         * UPPERCASE - 表示汉语拼音以小写字母输出
         */
        pinyinOutputFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        /**
         *定义汉语拼音声调的输出格式:汉语有四个声调和一个“无音”音。它们被称为Píng(平坦),Shǎng(上升),Qù(高下降),Rù(下降)和Qing(无音调)。
         * WITH_TONE_NUMBER(默认) - 表示汉语拼音以声调数字输出。比如:你说呢 - ni3 shuo1ni2
         * WITHOUT_TONE - 该选项表示不输出音号或音标记的汉语拼音 比如:你说呢 - ni shuoni
         * WITH_TONE_MARK - 表示输出带有音调标记的汉语拼音 比如:你说呢 - nĭshuōní
         */
        pinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        try {
            /**
             * 获取一个字符串,其中所有的中文字符都被相应的主(第一)汉语拼音表示所取代。
             * 参数:
             *  str - 中文串
             *  outputFormat - 描述返回的汉语拼音字符串的期望格式
             *  separate - 每个字的拼音使用什么分割符串显示。注意:分隔符不会出现在非中文字符之后。一般不使用任何分隔符("")时,大家都是紧挨着,看不出来的。
             *  retain - 是否保留不能转换为拼音的字符。true保留
             */
            fullPinyin = PinyinHelper.toHanYuPinyinString(str, pinyinOutputFormat, " ", false);
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return fullPinyin;
    }

    /**
     * 获取中文串转汉语全拼。(支持多音字,英文字符和特殊字符都保留。)
     *
     * @param str 字符串,为null,返回“”
     * @return 汉语全拼
     */
    public static String getFullSpellAndStr(String str) {
        String fullPinyin = "";
        if (str == null) {
            return fullPinyin;
        }

        HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
        pinyinOutputFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        pinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        try {
            // 保留不能转换为拼音的字符
            fullPinyin = PinyinHelper.toHanYuPinyinString(str, pinyinOutputFormat, " ", true);
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return fullPinyin;
    }

    /**
     * 获取中文串转汉语全拼首字母。(支持多音字。英文字符和特殊字符都丢弃。)
     *
     * @param str 字符串,为null,返回“”
     * @return 汉语全拼首字母
     */
    public static String getFirstSpell(String str) {
        StringBuilder firstPinyin = new StringBuilder();
        if (str == null) {
            return firstPinyin.toString();
        }
        HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
        pinyinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        pinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        // 获取中文
        String chinese = getChinese(str);
        char[] arr = chinese.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            try {
                // 获取单个汉字的全拼,取首字母
                String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[i], pinyinOutputFormat);
                if (temp != null) {
                    firstPinyin.append(temp[0].charAt(0));
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }
        }
        return firstPinyin.toString();
    }

    /**
     * 获取中文。(除中文之外,其他字符丢弃。)
     * @param str
     */
    public static String getChinese(String str) {
        if (str == null) {
            return "";
        }
        String regex = "[^\u4e00-\u9fa5]"; // 匹配非中文字符
        return str.replaceAll(regex, ""); // 替换非中文字符为空字符串
    }


    public static void main(String[] args) {
        System.out.println(getFullSpell("你说 重庆话"));
        System.out.println(getFullSpell("AbCd你说 重庆话"));
        System.out.println(getFullSpell("你说 重庆话(){}【】.@张三")); // NI SHUO CHONG QING HUA ZHANGSAN  注意:张三没有按分隔符分隔。因为它在非中文之后
        System.out.println(getFullSpell("AbCd你说 重庆话()zhangsan"));

        System.out.println("===============");
        System.out.println(getFullSpellAndStr("你说 重庆话"));
        System.out.println(getFullSpellAndStr("AbCd你说 重庆话"));
        System.out.println(getFullSpellAndStr("你说 重庆话(){}【】.@张三")); // NI SHUO  CHONG QING HUA (){}【】.@ZHANGSAN
        System.out.println(getFullSpellAndStr("AbCd你说 重庆话()zhangsan"));

        System.out.println("===============");
        System.out.println(getFirstSpell("你说 重庆话"));
        System.out.println(getFirstSpell("你说 重庆话张三"));
        System.out.println(getFirstSpell("你说 重庆话(){}【】.@张三"));

        System.out.println("===============");
        System.out.println(getChinese(""));
        System.out.println(getChinese("AbCd你说 重庆话(){}【】.@张三zhangsan"));

    }

}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

道岔表示故障电路如何进行检查

一、分线盘区分提速道岔表示电路故障的方法 定位时可以通过测量X1、X2 (或者反位时X1、X3)端子间的交直流电压和BD1-7的3号端子上的电流&#xff0c;来判断表示电路的故障和范围。表示电路正常工作时&#xff0c;在分线盘端子X1、X2之间可以测到电压交流60V左右&#xff0c;直…

小白也能学会的电脑C盘空间释放技巧大集合

引言 电脑C盘快装满了怎么办&#xff1f;这是很多人使用电脑时面临的困扰。电脑的运行速度会变得很慢&#xff0c;甚至出现蓝屏等问题。那么&#xff0c;如何解决电脑C盘快装满的问题呢&#xff1f;接下来&#xff0c;本文将详细介绍解决电脑C盘快装满的几种方法。 先记录一下…

浪涌保护器的工作原理

浪涌保护器&#xff08;SPD&#xff09;旨在通过限制瞬态电压和转移浪涌电流来保护电气系统和设备免受浪涌事件的影响。 浪涌可能来自外部&#xff0c;最强烈的是雷击&#xff0c;也可能来自内部的电气负载切换。这些内部浪涌的来源占所有瞬变的65%&#xff0c;可能包括负载打…

CSS | CSS中height:100vh和height:100%的区别

目录 1、对于设置height:100%;有下面几种情况 2、对于设置height:100vh时有如下的情况 首先&#xff0c;我们得知道1vh它表示的是当前屏幕可见高度的1/100&#xff0c;而1%它表示的是父元素长或者宽的1% 1、对于设置height:100%;有下面几种情况 &#xff08;1&#xff09;当…

【备战秋招】每日一题:5月13日美团春招:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

macOS降级,从 Ventura 13.0至Monterey 12.6.1,适用于m芯片电脑

Mac资源&#xff1a;macw 准备工作&#xff1a; 请确保已经备份Mac上的重要资料&#xff0c;我当时将重要资料保存在了iCloud&#xff0c;你也可以将资料备份到其他地方&#xff0c;anyway。 将对应文件夹拖进iCloud Drive&#xff0c;等待其完成上传 准备一个外置存储器&am…

【机器学习】十大算法之一 “K-means”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

第六章 彩色图像处理

第六章 彩色图像处理 6.1彩色基础 颜色特性&#xff1a; 亮度&#xff1a;表达了无色的强度概念色调&#xff1a;光波混合中与波长有关的属性&#xff08;即颜色&#xff09;饱和度&#xff1a;即相对纯净度&#xff0c;或一种颜色混合白光的数量。饱和度与所加白光成反比 …

tf卡和sd卡引脚定义和性能指标

sd卡和tf卡的引脚定义和引脚对应关系&#xff0c;见下图 tf卡的性能 选择tf卡时&#xff0c;我们主要是考虑下边几个性能&#xff0c;这几个性能一般都是可以直接看内存卡看出来的。 注&#xff1a;只介绍通过卡的标识来判断性能&#xff0c;卡的真假自己识别&#xff0c;不考…

踩坑笔记 Spring websocket并发发送消息异常

文章目录 示例代码WebSocketConfig配置代码握手拦截器代码业务处理器代码 问题复现原因分析解决方案方案一 加锁同步发送方案二 使用ConcurrentWebSocketSessionDecorator方案三 自研事件驱动队列&#xff08;借鉴 Tomcat&#xff09; 总结 今天刚刚经历了一个坑&#xff0c;非…

Linux系统基础知识与自学方法

大部分非计算机相关的朋友也经常使用电脑&#xff0c;所以我们频繁接触的是Windows系统。关于这个系统的评价不一&#xff0c;一部分人觉得简洁快捷&#xff0c;一部分人觉得问题&#xff08;病毒、弹窗&#xff09;多多&#xff0c;总之对Windows系统系统的评价参差不齐&#…

案例精述 | FortiEDR双活终端安全方案护航金融多云多分支场景

金融行业多云、多分支等特点&#xff0c;在数字化时代迎来更多安全挑战。尤其在勒索软件等威胁猖獗的大背景下&#xff0c;“安全运营”理念要求金融企业不仅要对威胁攻击“知其然”&#xff0c;还要“知其所以然”。因此&#xff0c;某金融企业希望提升端点安全防护&#xff0…

样本文件的使用方法以及注意事项

经常使用CHS零壹视频系列的朋友们应该对“样本文件”不陌生&#xff0c;在各种案例中我们也强烈建议在视频扫描时加载样本文件&#xff0c;而在视频修复时则样本文件成了必选项。今天我们来聊聊样本文件的作用和使用要求。 什么是样本文件&#xff1f; 从数据恢复广义的角度讲…

分布式文件系统HDFS

分布式文件系统HDFS 分布式文件系统计算机集群结构分布式文件系统的结构分布式文件系统的设计需求 HDFS简介HDFS相关概念块HDFS总体框架HDFS Client名称节点和数据节点名称节点数据节点 第二名称节点HDFS存在的问题 HDFS体系结构HDFS体系结构概述HDFS命名空间管理通信协议客户端…

Python高级系列教程:Python的进程和线程

学习目标 1、了解多任务的概念 2、了解进程的概念以及多进程的作用 3、掌握多进程完成多任务的工作原理及案例编写 4、掌握进程编号的获取方式以及进程使用的注意事项 5、了解线程的概念以及多线程的作用 6、掌握多进程完成多任务的工作原理及案例编写 一、多任务的概念 …

微服务 springcloud 05 hystrix框架,降级,可视化Hystrix dashboard 仪表盘,熔断

01.微服务宕机时&#xff0c;ribbon 无法转发请求 关闭 user-service 和 order-service 02.hystrix框架 03.创建hystrix项目&#xff0c;hystrix与ribbon经常一起出现 第一步&#xff1a;复制 sp06-ribbon 项目&#xff0c;命名为sp07-hystrix 选择 sp06-ribbon 项目&#…

一个Java程序员的C++学习之路

最近接到了一个Windows客户端开发&#xff0c;需要用到C&#xff0c;由于大学嵌入式学习的时候用到了这种东西&#xff0c;虽然没忘记吧&#xff0c;但是还是打算用一周的时间复习一下&#xff0c;下面是我的复习笔记&#xff0c;当然了&#xff0c;也是基于尚硅谷和黑马的笔记…

NLP——Ethics伦理

文章目录 Core NLP ethics conceptsbiasprivacy Group discussionAutomatic Prison Term PredictionAutomatic CV ProcessingLanguage Community Classification Core NLP ethics concepts 自然语言处理&#xff08;NLP&#xff09;的伦理问题是一个日益重要的领域&#xff0c…

007、体系架构之PD

PD PD架构主要功能路由功能 TSO分配TSO概念分配过程时间窗口同步过程 调度总流程信息收集调度的实现调度需求生成调度执行调度调度的基本操作调度的策略 lablelabel与高可用label的配置 PD架构 PD&#xff1a;有高可用和强一致性。 也有leader。使用奇数的节点数量。它需要存储…

10 分钟理解微服务、容器和 Kubernetes及其关系

什么是微服务&#xff1f; 什么是微服务&#xff1f;你应该使用微服务吗&#xff1f;微服务与容器和 Kubernetes 有什么关系&#xff1f;如果这些事情在您的日常生活中不断出现&#xff0c;并且您需要在 10 分钟内进行概述&#xff0c;那么这篇博文适合您。 从根本上讲&#x…