pinyin4j 常见用法

2023-11-05

1.     简单介绍

有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,通常都是用拼音进行查询的。比如要查询“曹孟德”,就可以输入“cmd”,即“曹孟德”三个汉字的拼音“caomengde”各字的首字母。但是怎样才能将“曹孟德”翻译成“caomengde”呢?很简单的办法就是建立一个大的对照表(比如用关联容器Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但这样的做法,需要维护好一个比较大的对照表,同时一个汉字可能有多个发音,也就是说Map这样的容器时不行的,因为其<key,value>必须是一一对应的。在C++中可以用STL里面的multimap来解决这个问题,但Java中没有类似multimap这样的东西,除非自己实现一个。

Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大:

+ 支持同一汉字有多个发音

+ 还支持拼音的格式化输出,比如第几声之类的,

+ 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。下面是其官方网址,其中提供了下载:

http://pinyin4j.sourceforge.net/

 

2.     基本用法:

通常情况下,只需要用到其中的PinyinHelper类中的静态方法toHanyuPinyinStringArray就可以了,比如:

String[] pinyinArray =PinyinHelper.toHanyuPinyinStringArray('单');

for(int i = 0; i < pinyinArray.length; ++i)

{

         System.out.println(pinyinArray[i]);

}

就会输出:

dan1

chan2

shan4

这三种发音,后面的数字代表第几声。可以看到静态方法toHanyuPinyinStringArray返回的数据类型是一个String数组,它用来接收一个汉字的多个发音,如果toHanyuPinyinStringArray中的参数不是汉字,那么它会返回null。

3.    格式支持

Pinyin4j支持拼音输出的格式化,比如,“黄”可以输出为“huang”、“huang2”、“huáng”等等,下面的代码就似是输出“huáng”的示例:

HanyuPinyinOutputFormat format= new HanyuPinyinOutputFormat();

format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);

format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);

                  

String[] pinyinArray = null;

try

{

         pinyinArray = PinyinHelper.toHanyuPinyinStringArray('黄', format);

}

catch(BadHanyuPinyinOutputFormatCombination e)

{

         e.printStackTrace();

}

for(int i = 0; i < pinyinArray.length; ++i)

{

         System.out.println(pinyinArray[i]);

}

此外,还支持大小写转换、ü等等。详细情况,可以查看Pinyin4j自带的文档。

4.    实际示例代码

如果我们要将一段文字中的汉字全部转换成不带音调的拼音输出,而这段文字中又可能包含阿拉伯数字、英文、标点符号等等。如果完全靠自己写代码进行转换,那是非常麻烦的,其中一个首先就要区别,这段文字中那些是汉字,那些是非汉字。有了Pinyin4j,这个问题就不再困难了,因为对于非汉字,Pinyin4j会自动输出null。参考下面的示例代码:

importnet.sourceforge.pinyin4j.*;

importnet.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;

importnet.sourceforge.pinyin4j.format.HanyuPinyinToneType;

importnet.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

 

public class Chinese2PY

{

         public static void main(String[] args)

         {       

                   Hanyu hanyu = new Hanyu();

                   // 中英文混合的一段文字

                   String str = "荆溪白石出,Hello 天寒红叶稀。Android 山路元无雨,What's up?   空翠湿人衣。";

                   String strPinyin = hanyu.getStringPinYin(str);

                   System.out.println(strPinyin);

         }

}

 

class Hanyu

{

         private HanyuPinyinOutputFormat format = null;

         private String[] pinyin;

        

         public Hanyu()

         {

                   format = new HanyuPinyinOutputFormat();

                   format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

                  

                   pinyin = null;

         }

        

         //转换单个字符

         public String getCharacterPinYin(char c)

         {

                   try

                   {

                            pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);

                   }

                   catch(BadHanyuPinyinOutputFormatCombination e)

                   {

                            e.printStackTrace();

                   }

                  

                   // 如果c不是汉字,toHanyuPinyinStringArray会返回null

                   if(pinyin == null) return null;

                  

                   // 只取一个发音,如果是多音字,仅取第一个发音

                   return pinyin[0];   

         }

        

         //转换一个字符串

         public String getStringPinYin(String str)

         {

                   StringBuilder sb = new StringBuilder();

                   String tempPinyin = null;

                   for(int i = 0; i < str.length(); ++i)

                   {

                            tempPinyin =getCharacterPinYin(str.charAt(i));

                            if(tempPinyin == null)

                            {

                                     // 如果str.charAt(i)非汉字,则保持原样

                                     sb.append(str.charAt(i));

                            }

                            else

                            {

                                     sb.append(tempPinyin);

                            }

                   }

                   return sb.toString();

         }

}

输出结果:

jingxibaishichu,Hellotianhanhongyexi。Android shanluyuanwuyu,What'sup?   kongcuishirenyi。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pinyin4j 常见用法 的相关文章

  • [管理与领导-88]:IT基层管理者 - 扩展技能 - 5 - 职场丛林法则 -2- 在职场丛林中的黑暗森林法则,在没有弄清楚情况前保持低调地调研

    前言 管理者空降到一个新的环境中 对环境中的人和事都不熟悉 此时的管理者不适合新官上任三把火 而应该意识到 环境中处处充满陷阱 危险 冷箭和一双双冷眼旁观的眼睛和暗箭 一 黑暗森林法则 黑暗森林法则 也被称为刘慈欣的科幻小说 三体 系列中提
  • Vue3的emit(‘update:modelValue‘)

    目录 概述 正文 一 v model 在原生 input 上的用法 二 使用v model在组件上实现双向绑定 通过计算属性实现 概述 在Vue3中 子组件可以通过 emit自定义事件来向父组件传递数据 在这种情况下 父组件可以通过监听子组
  • 查看服务器用户所占空间

    查看服务器个人账户所占空间大小 du h max depth 1 wangsx localhost du h max depth 1 0 mozilla 32K config 46G project 3 7G software 0 data
  • Spring中IOC容器

    IOC入门案例思路分析 1 管理什么 Service和Dao 2 如何将管理的对象存放到IOC容器 配置applicationContext xml 第二步 3 将管理的对象存放到IOC容器 如何获取IOC容器 第三步 4 获取到IOC容器
  • Dos环境变量修改

    批处理修改环境变量 修改用户变量 系统变量 全局变量 永久 临时设置环境变量 设置Java环境变量 关于路径问题 在执行批处理命令时 需要用到路径变量 这里先说明路径相关的变量参数 echo 当前盘符 d0 echo 当前盘符和路径 dp0
  • 6.830 / 6.814: Syllabus 2021 - MIT Lab 2 - SimpleDB Operators

    文章目录 1 参考链接 2 SimpleDB Architecture and Implementation Guide 2 1Filter and Join 2 2 Aggregates 2 3HeapFile Mutability 2
  • 在你的 Android 手机上运行 Golang 程序

    在我们日常开发中 运行一个服务 都是在 shell 或 cmd 下执行命令 像是使用 go run main go 直接编译运行 或是 go build 编译生成可执行文件后 以 xxx 方式运行 Go 支持交叉编译生成各平台的可执行文件
  • Linux中makefile

    第一个版本的makefile Makefile的依赖是从上至下的 换句话说就是目标文件是第一句里的目标 如果不满足执行依赖 就会继续向下执行 如果满足了生成目标的依赖 就不会再继续向下执行了 Make会自动寻找依赖条件所用到的文件 其中 我
  • 2018-12-22-jekyll-theme-H2O

    layout post title jekyll主题theme H2O categories jekyll GitHub tags jekyll GitHub theme H2O jekyll theme H2O 基于Jekyll的博客主题
  • Django基础入门⑩:Django查询数据库操作详讲

    Django基础入门 Django查询数据库操作详讲 Django查询数据库操作 基础操作 查询数据 比较运算符 逻辑符号 去重查询 分组集合 排序查询 分页操作 模糊查询 多表查询 执行原生 SQL 个人简介 以山河作礼 Python领域
  • 【数据结构】数组

    1 计算一维数组存储地址 a i 公式 a i L a 起始地址 i 当前i个元素下标 L 每个元素所占字节 例 int a 10 已知a 1000 sizeof int 4 求a 3 地址 1000 3 4 1012 2 计算二维数组存储
  • SQL注入之时间盲注 和 报错注入(sql-lab第一关为例)

    什么是时间盲注 时间盲注指通过页面执行的时间来判断数据内容的注入方式 通常用于数据 包含逻辑型 不能返回到页面中的场景 无法利用页面回显判断数据内容 只能通过执行的时间来获取数据 时间盲注的过程 1 找到注入点 并选择合适的注入语句 2 爆
  • hexo搭建博客-butterfly主题详细版

    Hexo搭建博客 butterfly主题 前置知识 对于Github和Gitee的基本了解与使用 最关键的是你要知道github为什么访问的这么慢 如何魔法上网访问github 或者说不用魔法如何访问github 本文在可能遇到的问题说明了
  • c语言用串口读温度值,温度传感器与串口

    1 题目要求 有时候我们需要知道在一段时间里温度传感器测量的温度的历史数据 之前的温度传感器例程只是在液晶屏上实时显示出数据而已 并不能查看它的历史数据 所以我们运用之前所有学过的知识来完成这个任务 首先我们先从简单的理念入手 利用串口每隔
  • 数学推导+纯Python实现机器学习算法12:贝叶斯网络

    Python机器学习算法实现 Author louwill 在上一讲中 我们讲到了经典的朴素贝叶斯算法 朴素贝叶斯的一大特点
  • 计算机图形技术在游戏领域应用,计算机图形图像技术在美术领域中的应用

    摘 要 现如今科学技术日益发展的时代 图像的发展已经不能够满足人类的需求 它不只是表現人们视野中的影像 通过各个领域的先进的专业的软件和技术 能够更加成功的表现出来 计算机图形图像技术已经不断的实践在各个领域 下文是对其主要应用的分析研究
  • java iterable 使用_Iterable(迭代器)的用法

    一 前言 在开发中 经常使用的还是for each循环来遍历来Collection 不经常使用Iterable 迭代器 的 下面记录一下terable是一般用法 二 说明 迭代器是一种设计模式 它是一个对象 它可以遍历并选择序列中的对象 而
  • U盘提示格式化怎么办?3个方法轻松解决!

    我的u盘已经很久没用了 今天刚把u盘插入电脑就显示需要进行格式化 但是我还有很多重要的文件都保存在里面呢 这可怎么办呀 有什么方法恢复里面的数据吗 u盘是我们日常生活中常用的移动存储设备之一 但有时可能会遇到一个让人烦恼的问题 那就是当插入
  • TypeScript基础小课堂二

    上期简单的介绍了一下TS的安装和运行环境 现在正式进入知识点阶段 1 TS类型注解 TypeScript 是 JS 的超集 TS 提供了 JS 的所有功能 并且额外的增加了 类型系统 TS中定义变量 常量 可以指定类型 A类型的变量不能保存

随机推荐

  • Mysql Too many connections

    程序启动过程中 连接mysql异常 信息如下 Caused by com mysql cj exceptions CJException Data source rejected establishment of connection me
  • Android 开发简易失物招领二手交易平台

    一 开发环境 1 android studio 客户端 eclipes 服务端 2 java语言 二 效果展示 视频地址 https www bilibili com video BV1Ng4y1v7XC 三 客户端开发 1 首先设置mai
  • 交换机与路由器技术-37-端口安全

    目录 一 端口安全 1 1 课程引入 1 2 基本概念 1 3 作用 1 4交换机端口安全配置 1 4 1 配置最大活跃地址数量 1 4 2 配置静态MAC地址和接口绑定 1 4 3配置接口老化时间 1 4 4 配置MAC地址违规后的操作
  • 什么是微服务架构,有何优缺点?

    什么是微服务架构 通常而言 微服务架构是一种架构模式或者说是一种架构风格 它提倡将单一应用程序划分成一组小的服务 每个服务运行独立的自己的进程中 服务之间互相协调 互相配合 为用户提供最终价值 服务之间采用轻量级的通信机制互相沟通 通常是基
  • npm link的作用与使用

    1 npm link 使用场景 库包在开发或迭代后 不适合发布到线上进行调试 过程繁琐且会导致版本号膨胀 这个时候就可以通过npm link将包放入到node的安装目录下的node modules文件夹中 这样就可以直接使用包名直接在本地调
  • js 实时监听input中值变化 【转】

    文章出处 js 实时监听input中值变化 h1 h1
  • 弗洛伊德算法(floyd)

    弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题 弗洛伊德算法使用了动态规划的思想 用二维矩阵记录了所有点之间最短的距离 虽然代码只有几行 但是思想还很值得回味的 其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短 公式 v
  • 看过来——用Python探索《红楼梦》的人物关系

    数据准备 红楼梦 txt 文件一份 金陵十二钗 贾宝玉 人物名称列表 宝玉 nr 黛玉 nr 宝钗 nr 湘云 nr 凤姐 nr 李纨 nr 元春 nr 迎春 nr 探春 nr 惜春 nr 妙玉 nr 巧姐 nr 秦氏 nr 该分列表是为了
  • SpringBoot Admin服务离线、不显示健康信息的问题

    SpringBoot Admin服务离线 不显示健康信息的问题 问题1 SpringBoot Admin服务一直离线 原因 解决方法 重启电脑 重新加载配置文件 问题2 数据显示不全 解决方法 问题1 SpringBoot Admin服务一
  • 进程篇----获取进程句柄(提权、打开)OpenProcess

    对目标进程提权 然后打开 提权的目的是为了防止当前进程的权限无法打开目标进程 获取句柄 BOOL EnableDebugPrivilege TRUE 代表需要提权 BOOL EnableDebugPrivilege FALSE 代表不需提权
  • Python:统计子矩阵(前缀和、尺取法)

    问题描述 给定一个 N M 的矩阵 A 请你统计有多少个子矩阵 最小 1 1 最大 N M 满足子矩阵中所有数的和不超过给定的整数 K 输入格式 第一行包含三个整数 N M 和 K 之后 N 行每行包含 M 个整数 代表矩阵 A 输出格式
  • arduino python scratch_arduino怎么和scratch用

    展开全部 arduino可以和scratch在一起使用62616964757a686964616fe58685e5aeb931333433633365 但环节比较复杂 每个环节都需要注意 具体方法如下 1 由于scratch软件和ardui
  • SpringBoot Bean指定初始化顺序详解

    最近遇到SpringBoot容器外类初始化依赖容器内bean的问题 由于容器内bean初始化有一定顺序 网上查了查资料 这里记录一下 0 前言 本文将介绍几种可行的方式来控制 bean 之间的加载顺序 Order指明顺序 AutoConfi
  • 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...

    操作系统有哪几大特征 其最基本的特征是什么 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 操作系统有哪几大特征 其最基本的特征是什么 操作系统的基本特征 1 并
  • Java串口包Javax.comm的安装

    安装个java的串口包安装了半天 一直找不到串口 现在终于搞定了 做个记录 因为是windows下开发 去下载 http mdubuc freeshell org Jolt javacomm20 win32 zip 完整的2 0版本 还有e
  • visual studio 2008 试用版评估期已结束的解决方法

    在 控制面板 中启动 添加删除程序 选中Vs2008 点击 更改 删除 输入序列号 PYHYP WXB3B B2CCM V9DX9 VDY8T
  • 深入ZooKeeper——ZooKeeper原语和架构

    ZooKeeper基础 设计一个用于协作需求的服务的方法往往是 提供原语列表 暴露出每个原语的实例化调用方法 并直接控制这些实例 这种设计存在一些重大的缺陷 首先 我们要么预先提出一份详尽的原语列表 要么提供API的扩展 以便引入新的原语
  • 输出斐波那契数列前n项以及前n项和

    首先介绍一下斐波那契数列 1 1 2 3 5 8 13 21 34 55 在数学上 斐波那契数列以递推的方法定义 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 代码的实现 斐波那契数列 int fibonacci
  • Koa笔记 01:基础入门

    文章目录 目的 基础介绍 Koa Context Request Response 错误处理 总结 目的 Node js最基本的是用来搭建HTTP服务器使用 它内置的模块基本上可以满足基础的HTTP服务器功能 但是如果要实现比较完整的HTT
  • pinyin4j 常见用法

    1 简单介绍 有时候 需要将汉字编程对应的拼音 以方便数据的处理 比如在Android手机应用的开发上 要查询联系人的姓名 通常都是用拼音进行查询的 比如要查询 曹孟德 就可以输入 cmd 即 曹孟德 三个汉字的拼音 caomengde 各