1. 介绍

本文对TinyPinyin、Pinyin4j与JPinyin三个汉字转拼音库的用法、测试代码及转换的结果做一个简单的总结。

TinyPinyin

适用于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'

Pinyin4j

A copy of http://sourceforge.net/projects/pinyin4j, then deploy it to maven central repository.

compile 'com.belerweb:pinyin4j:2.5.0'

JPinyin

汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。

1 compile 'com.github.stuxuhai:jpinyin:1.1.8'

对于开源库,建议使用之前进入其主页了解当前实现的功能和版本号,毕竟别人的文章作为二手资料,目的在于抛砖引玉。

2. 测试

利用Android Studio建立Android项目PinyinTest来测试,具体的库依赖添加和布局文件可以下载后查看。

代码用Kotlin编写,入门文章:

Kotlin学习第一课:从对比Java开始

Kotlin入门第二课:集合操作

初次尝试用Kotlin实现Android项目

应用运行初始界面:

界面由一个编辑框(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哪个库更快相关推荐

  1. 关于汉字转拼音的Pinyin4j工具使用

    关于汉字转拼音的Pinyin4j工具使用 1 Pinyin4j的简介 2 Pinyin4j的使用 1 添加maven依赖 2 添加汉字转拼音工具类 关于汉字转为拼音的相关实现,通常使用Pinyin4j ...

  2. 汉字转拼音,pinyin4j使用详细介绍

    汉字转拼音,pinyin4j使用详细介绍 首先,在pom.xml文件中导入依赖. <!-- pinyin4j --> <dependency><groupId>co ...

  3. java 判断汉字音调_JAVA实现汉字转换为拼音 自动识别常用多音字 JPinyin

    JAVA实现汉字转换为拼音 自动识别常用多音字 JPinyin 使用JPinyin,可以实现汉字转换为拼音,并自动识别常用多音字,还支持简体转换为繁体,检查是否为简体,是否为繁体,是否为中文字符等功能 ...

  4. sql unicode转中文_汉字转拼音的Java类库 JPinyin

    JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进. [JPinyin主要特性] 1.准确.完善的字库: Unicode编码从4E00-9FA5范围及3007 ...

  5. JAVA汉字转拼音工具(pinyin4j)

    pinyin4j 介绍 pinyin4j 是一个支持将简体和繁体中文转换到成拼音的Java开源类库 支持同一汉字有多个发音 还支持拼音的格式化输出,比如第几声之类的, 同时支持简体中文.繁体中文转换为 ...

  6. 汉字转拼音之pinyin4j 简单使用

    Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换,拼音输出格式可以定制,在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,这时候Pinyin4j就可以派上用场 Pinyin4j ...

  7. java hanyupinyinoutputformat();_Java汉字转拼音pinyin4j用法

    Java汉字转拼音pinyin4j用法 在学习编程的过程中,我觉得不止要获得课本的知识, 更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请登陆疯狂java官网. ...

  8. java 判断汉字音调_Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH", ...

  9. Android Studio 汉字转拼音

    今天上课的时候老师讲到了汉字转拼音的问题,感觉挺有意思的,就自己捣鼓了一下. 查阅了一些资料,发现java获取汉字的拼音,pinyin4j.jar这个库可以很好的解决此类问题,先是用Myeclipse ...

最新文章

  1. 在CentOS上把MySQL从5.5升级到5.6
  2. comparator比较器用法_Python学习:好像很少人知道 Python iter() 的另外一个用法?...
  3. IntelliJ IDEA创建web项目及异常问题解决
  4. java中map的put方法,Java TreeMap put()方法
  5. 史上最全SVN使用总结,建议先收藏后观看
  6. 机器学习与数据挖掘简介
  7. 为什么我的mysql比redis快_为什么redis是单线程的以及为什么这么快?
  8. maven多个子项目、父项目之间的引用问题
  9. Kubernetes负载均衡器-traefik ingress安装
  10. CS和BS结构的优缺点
  11. Message和handler传递对象
  12. 20155220 Exp5 MSF基础应用
  13. 今日收获:图片数据的存和取示例
  14. 全球及中国电子材料市场需求分析与十四五投资潜力预测报告2021年版
  15. Springboot使用J2Cache,整合ehcache和redis缓存框架,实现两级缓存
  16. linux sar 分析,Linux性能测试分析命令_sar
  17. 结构方程模型自由度和卡方值为0(零)怎么办?
  18. 关于冒险岛,8090的不二游戏
  19. 夜神模拟器没有开发者选项怎么办?
  20. Multisim14.0仿真:单相桥式全控整流电路

热门文章

  1. 周志华-机器学习西瓜书-第三章习题3.3 编程实现对率回归
  2. 《数据库系统概念》20-恢复系统
  3. AngularJS中的表单验证机制
  4. SuperPro 3000U 编程器电源部分
  5. SGU 274 Spam-filter
  6. div居中以及div中的元素居中
  7. ViewFlipper的简单使用
  8. ssh整合之三(实现逻辑)
  9. Java基础提高学习笔记1
  10. molicode生成vue增删改查功能