汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快
1. 介绍
本文对TinyPinyin、Pinyin4j与JPinyin三个汉字转拼音库的用法、测试代码及转换的结果做一个简单的总结。
适用于Java和Android的快速、低内存占用的汉字转拼音库。
在Android项目中使用时,需要在module app下的build.gradle文件中添加依赖(下同):
1 compile 'com.github.promeg:tinypinyin:2.0.3'
2 compile 'com.github.promeg:tinypinyin-lexicons-android-cncity:2.0.3'
A copy of http://sourceforge.net/projects/pinyin4j, then deploy it to maven central repository.
compile 'com.belerweb:pinyin4j:2.5.0'
汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。
1 compile 'com.github.stuxuhai:jpinyin:1.1.8'
对于开源库,建议使用之前进入其主页了解当前实现的功能和版本号,毕竟别人的文章作为二手资料,目的在于抛砖引玉。
2. 测试
利用Android Studio建立Android项目PinyinTest来测试,具体的库依赖添加和布局文件可以下载后查看。
代码用Kotlin编写,入门文章:
应用运行初始界面:

界面由一个编辑框(TextInputEditText)和按钮(Button)组成,前者供编辑,后者被点击后开始拼音的转换。
为方便测试,在布局文件中设置编辑框默认文本为"真正的稳定,不是拿着固定不变的工资熬日子,世界每天都在变化,很多时候我们所谓的稳定,其实是自己的异想天开。真正的自由,是内心的自由,明白自己想走的路,明确自己想要的生活。做任何事情都要付出,怕,畏缩不前,什么都干不成。"。可以编辑成别的内容,但这段文字足以测试三个库转换的差异。
2.1 按钮点击事件绑定
"转换"按钮在布局文件中的id为convert_btn,Kotlin代码:
1 convert_btn.setOnClickListener {
2 var content: String = content_tiet.text.toString()
3 if (TextUtils.isEmpty(content)) {
4 Toast.makeText(this, "请输入内容,谢谢", Toast.LENGTH_SHORT).show()
5 } else {
6 tinypinyin(content)
7 pinyin4j(content)
8 jpinyin(content)
9 }
10 }
不用findViewById和注解,只需关注实现的功能,这就是Kotlin的简洁性。
Android库方法TextUtils.isEmpty()在参数为null或者length为0时会返回true,所以,编辑框如果没有内容则提示用户先输入;否则调用自定义的方法。

2.2 TinyPinyin转换
方法:
1 fun tinypinyin(content: String) {
2 val start_time: Long = System.currentTimeMillis()
3 val stringBuilder = StringBuilder()
4 stringBuilder.setLength(0)
5 for (c in content) {
6 stringBuilder.append(Pinyin.toPinyin(c))
7 }
8 val end_time: Long = System.currentTimeMillis()
9 Log.i("pinyintest", "tinypinyin time: " + + (end_time - start_time) + "ms")
10 Log.i("pinyintest", "tinypinyin content: " + stringBuilder.toString().toLowerCase())
11 }
主要代码Pinyin.toPinyin(c),如果字符c为汉字,返回对应的拼音;否则返回字符本身。
结果:
tinypinyin time: 9ms
tinypinyin content: zhenzhengdewending,bushinazhegudingbubiandegongziaorizi,shijiemeitiandouzaibianhua,henduoshihouwomensuoweidewending,qishishizijideyixiangtiankai。zhenzhengdeziyou,shineixindeziyou,mingbaizijixiangzoudelu,mingquezijixiangyaodeshenghuo。zuorenheshiqingdouyaofuchu,pa,weisuobuqian,shenmedouganbucheng。
2.3 Pinyin4j转换
方法:
1 fun pinyin4j(content: String) {
2 val start_time: Long = System.currentTimeMillis()
3 val stringBuilder = StringBuilder()
4 stringBuilder.setLength(0)
5 val hanyuPinyinOutputFormat = HanyuPinyinOutputFormat()
6 hanyuPinyinOutputFormat.toneType = HanyuPinyinToneType.WITHOUT_TONE
7 try {
8 for (c in content) {
9 val result = PinyinHelper.toHanyuPinyinStringArray(c, hanyuPinyinOutputFormat)
10 if (result != null) {
11 stringBuilder.append(result[0])
12 } else {
13 stringBuilder.append(c)
14 }
15 }
16 } catch (badHanyuPinyinOutputFormatCombination: BadHanyuPinyinOutputFormatCombination) {
17 badHanyuPinyinOutputFormatCombination.printStackTrace()
18 }
19 val end_time: Long = System.currentTimeMillis()
20 Log.i("pinyintest", "pinyin4j time: " + + (end_time - start_time) + "ms")
21 Log.i("pinyintest", "pinyin4j content: " + stringBuilder.toString().toLowerCase())
22 }
相比之下,Pinyin4j的使用要繁琐地多,如代码第5-6行先生成一个HanyuPinyinOutputFormat对象,用来指定是否需要声调等信息;还需为转换过程添加异常处理。
主要代码PinyinHelper.toHanyuPinyinStringArray(c, hanyuPinyinOutputFormat),如果c为汉字,返回的result非null,取[0]为拼音;否则result为null。因此,必须对结果进行判断,对不同情况做处理。
结果:
pinyin4j time: 209ms
pinyin4j content: zhenzhengdewending,bushinazhegudingbubiandegongziaorizi,shijiemeitiandouzaibianhua,henduoshihouwomensuoweidewending,qishishizijideyixiangtiankai。zhenzhengdeziyou,shineixindeziyou,mingbaizijixiangzoudelu,mingquezijixiangyaodeshenghuo。zuorenheshiqingdouyaofuchu,pa,weisuobuqian,shenmedouganbucheng。
2.4 JPinyin转换
方法:
1 fun jpinyin(content: String) {
2 val start_time: Long = System.currentTimeMillis()
3 val stringBuilder = StringBuilder()
4 stringBuilder.setLength(0)
5 stringBuilder.append(PinyinHelper.convertToPinyinString(content, "", PinyinFormat.WITHOUT_TONE))
6 val end_time: Long = System.currentTimeMillis()
7 Log.i("pinyintest", "jpinyin time: " + + (end_time - start_time) + "ms")
8 Log.i("pinyintest", "jpinyin content: " + stringBuilder.toString().toLowerCase())
9 }
主要代码PinyinHelper.convertToPinyinString(content, "", PinyinFormat.WITHOUT_TONE),从转换过程来看JPinyin是最方便的。因为它是直接对整个字串content进行处理,不用通过迭代操作每个字符。
同样地,第三个参数表示忽略声调,而第二个参数指定各个字符转换结果的分隔符,这里是空字串。
结果:
jpinyin time: 417ms
jpinyin content: zhenzhengdewending,bushinazhuogudingbubiandegongziaorizi,shijiemeitiandouzaibianhua,henduoshihouwomensuoweidewending,qishishizijideyixiangtiankai。zhenzhengdeziyou,shineixindeziyou,mingbaizijixiangzoudelu,mingquezijixiangyaodeshenghuo。zuorenheshiqingdouyaofuchu,pa,weisuobuqian,shenmedouganbucheng。
3. 总结
除了默认文本,还输入过其他字串进行测试,三个库转换所消耗的时间差异类似。JPinyin介绍是说在Pinyin4j的基础上做的改进,虽然调用方法上简单了,但是转换速度方面竟然要差一些。
因此,TinyPinyin是在三个库中比较理想的选择,如果进一步深入看它们的实现源码,就能明白为什么速度上有那么大的差异。
如果大家知道更好的汉字转拼音库,请推荐。
汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快的更多相关文章
- 汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快
1. 介绍 本文对TinyPinyin.Pinyin4j与JPinyin三个汉字转拼音库的用法.测试代码及转换的结果做一个简单的总结. TinyPinyin 适用于Java和Android的快速.低内 ...
- 汉字转拼音(pinyin4j)
1.引入依赖 <dependency> <groupId>pinyin4j.sourceforge.net</groupId> <artifactId> ...
- 汉字转拼音的Java类库——JPinyin
原文:http://blog.csdn.net/stuxuhai/article/details/8932715 [JPinyin主要特性]1.准确.完善的字库:Unicode编码从4E00-9FA5 ...
- JAVA实现汉字转换为拼音 pinyin4j/JPinyin
在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,比如说通讯录,就会要求按名字首字符发音排序,如果自己写实现这方面的功能是个很好大的工程,还好网上有公开的第三方jar支持转换,结合网上很多前辈的代 ...
- 汉字转拼音的Java类库:JPinyin
JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进. [JPinyin主要特性]1.准确.完善的字库:Unicode编码从4E00-9FA5范围及3007(〇 ...
- 用jpinyin实现汉字转拼音功能
一.简介 项目地址:https://github.com/stuxuhai/jpinyin JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进. [JPiny ...
- 汉字转拼音开源工具包Jpinyin介绍
最近要实现一个根据词语得到词语对应拼音的功能,找到了Jpinyin这个开源工具包,使用下来发现它非常强大,完全满足我的需求,下面对它做一个简单的介绍,希望能够帮助到有需要的朋友. https://gi ...
- 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)
转:https://github.com/kimziv/PinYin4Objc 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)(更新到v1.1.1,增加block异步处 ...
- Java通过pinyin4j实现汉字转拼音
碰到个需求,需要按用户名字的首字母来排序.这就需要获取汉字对应的拼音了,突然就想起了pinyin4j这个jar包,于是就开始写了个汉字转拼音的工具类.在此记录一下,方便后续查阅 一.Pom依赖 ...
随机推荐
- 用maven对ssm进行整合
网上有很多ssm整合的教程,这里给像我这样的初学的新手提供一个整合方法,同时也记录一下自己的学习进度. 同时推荐观看相关视频 https://www.bilibili.com/video/av536 ...
- vue中使用axios进行ajax请求数据(跨域配置)
npm安装axios npm install axios --save 引入axios import axios from 'axios' 使用axios mounted () { this.getH ...
- vue学习指南:第六篇(详细) - Vue的组件 component
1. 什么是组件?有两种解释 1. 第一种解释: 什么是组件? 1. 组件是 vue 中的一个可复用的实例,所以new Vue() 是vue中最大的那个组件(根组件),有名字,使用的时候以单标签或双标 ...
- Oracle使用命令行登录提示ERROR: ORA-01017: invalid username/password; logon denied
刚在Windows上面安装好Oracle 10g,刚开始使用PLSQLDevelop软件登录提示 not logged on ,然后使用命令行登录提示 ERROR: ORA-01017: inval ...
- 数字,字符串,time模块,文本进度条
数字和字符串 数字类型 整形 整数, 1/2/3/12/2019 整形用来描述什么, 身高/年龄/体重 age = 18 height = 180 浮点型 浮点数,小数 salary = 10 pri ...
- PHP导出3w条数据成表格
亲测有效,三万条数据秒秒钟导出 先进行数据表插入数据 ini_set('memory_limit','1024M'); //设置程序运行的内存 ini_set('max_execution_time' ...
- Centos7安装dubbo与zookeeper服务配置
目录 环境: 第一步:安装jdk,并且配置环境变量 1.解压jdk: 2.配置环境变量: 3.保存并使文件立即生效: 4.立即重启虚拟机,进行下面的安装 第二步:安装注册中心zookeeper 1.解 ...
- Python语言基础01-初识Python
本文收录在Python从入门到精通系列文章系列 1. Python简介 1.1 Python的历史 Python的创始人为吉多·范罗苏姆(荷兰语:Guido van Rossum) 1989年的圣诞节 ...
- ppm
PPM图像格式是由Jef Poskanzer 在1991年所创造的. PPM(Portable Pixmap Format)还有两位兄长,大哥名叫「PBM」,二哥人称「PGM」,他们三兄弟各有所长,下 ...
- 通过Socket实现TCP编程(十二)
原文链接:https://www.cnblogs.com/hysum/p/7531529.html Socket通信 : TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 基于TCP ...