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 incontent) { 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 incontent) { 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是在三个库中比较理想的选择,如果进一步深入看它们的实现源码,就能明白为什么速度上有那么大的差异。

如果大家知道更好的汉字转拼音库,请推荐。

android studio拼音转汉字,汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快相关推荐

  1. 汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快

    1. 介绍 本文对TinyPinyin.Pinyin4j与JPinyin三个汉字转拼音库的用法.测试代码及转换的结果做一个简单的总结. TinyPinyin 适用于Java和Android的快速.低内 ...

  2. Android开发-Android studio自带模拟器使用中文拼音输入法

    Android开发-Android studio自带模拟器使用中文拼音输入法 搜狗输入法下载 搜狗输入法安装 修改模拟器语言 搜狗输入法下载 上篇文章中我们在Android studio中创建了X86 ...

  3. Android系统----AS 3.1 支持的新版 D8,让你的编译更快、更小、更顺滑

    一.前言 Android Studio 3.1 稳定版,在前几天正式发布了. 其中包含了 D8 Dex Compiler,它在 AS3.1 中,被设置为了默认的 dex 编译器. 那么今天就来聊聊,什 ...

  4. android studio开发十一 Library第三方类库源码, Jar包和SO库

    原创: 发现android里面不熟悉的东西太多了,查了好多资料,终于搞清楚 Library第三方类库源码, Jar包和SO库这些都是干什么的了,怎么使用它们了. [Library第三方类库源码] Ja ...

  5. android 百度浏览器内核,百度浏览器安卓6.2版上线:新一代内核更快更稳定

    10月20日,以趣星球闻名深受年轻群体喜爱的百度浏览器发布最新安卓6.2版本,跟随该版本,T7内核也正式亮相,T7内核是基于Blink内核的重构和产品化,针对中国人的使用习惯进行了大幅优化,大幅提升浏 ...

  6. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

    文章目录 一.交叉编译 Shell 脚本参考 二.NDK r16b 版本配置 三.libjpeg-turbo 交叉编译 Shell 脚本 四.执行 libjpeg-turbo 交叉编译 Shell 脚 ...

  7. 在 Android Studio 2.2 中愉快地使用 C/C++

    2019独角兽企业重金招聘Python工程师标准>>> Android Studio 2.2 正式版发布后,看到更新内容中有提到对 C/C++ 支持的完善,表示非常高兴.然后将官网上 ...

  8. android xml 未能解析文件,Android Studio提示“无法解析符号”,但项目已编译

    我在build.gradle中使用以下内容在AndroidStudio中导入twitter4j: dependencies { compile 'com.android.support:support ...

  9. Android Studio下载、安装、配置及连接真机开发第一个App ——入门选手快进

      最近的安卓测试给我心态搞蹦了,问也没人问,难受简直了!又是一轮自学之路(说实话这一路上教会我一个很大的道理就是一定要有愿意帮助你的老师,还有自己的自觉,一样也不能少.前者没有的话只能后者补了呜呜呜 ...

  10. Android Studio上Kotlin的入门,移动应用系统开发

    Kotlin入门 为什么选择Kotlin Kotlin是什么 Kotlin的优势 第一个Kotlin应用 Kotlin的基本语法规则 变量 函数 匿名函数 字符串模板 注释 Null 安全 类型检测和 ...

最新文章

  1. 分析2021年私有云市场的发展趋势
  2. jdk自带压测工具_FULL GC分析过程分享
  3. Nacos注册中心——启动相关的配置
  4. Linux下Git和GitHub使用方法总结(Ubuntu16.04)
  5. linux opencv cmake,OpenCV基础篇之使用CMake管理工程
  6. OPPORTUNITIES_GET_ENTITY not implemented in data provider class
  7. python程序设计语言的执行方式_编程语言用Python执行程序的4种方式
  8. flex4与java_Flex4与java传递对象
  9. 【指纹识别】基于matlab GUI指纹识别门禁系统【含Matlab源码 1692期】
  10. Win7 vs2010+Silverlight4开发安装顺序
  11. 道岔及转辙机结构详解
  12. 会计计算机二级考试试题,计算机二级考试真题-Word-小刘-会计电算化节节高升...
  13. 世界十大工业自动化公司排名
  14. MMO游戏服务器从零开发(架构篇)- 网络部分
  15. 正则表达式判断用户昵称
  16. python之循环语句
  17. 关于手机内部存储,外部存储
  18. 嵌入式Linux驱动:LRADC按键
  19. 极坐标格式算法MATLAB,极坐标格式算法,polar format algorithm,音标,读音,翻译,英文例句,英语词典...
  20. 联邦学习开山之作代码解读与收获

热门文章

  1. 认识CPU的工作原理
  2. python公众号文章阅读量_怎么判断一篇微信公众号文章阅读量是不是刷上来的?...
  3. 电力电子技术课程设计matlab,电力电子技术课程设计-基于matlab的单相交流调压电路的设计与仿真.doc...
  4. [生存志] 第108节 李斯划分三十六郡
  5. 利用IPV6实现宿舍远程连接实验室并免费上网
  6. SVN Clean up 失败和SVN is already locked情况解决
  7. MDK与keilC51共存的方法
  8. 兼容性视图html页面,浏览器兼容性视图设置在哪
  9. 单工,半双工,全双工区别以及TDD和FDD区别
  10. redis mset是否具有原子性