漢字轉拼音,TinyPinyin、Pinyin4j與JPinyin哪個庫更快


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編寫,入門文章:

應用運行初始界面:

界面由一個編輯框(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是在三個庫中比較理想的選擇,如果進一步深入看它們的實現源碼,就能明白為什么速度上有那么大的差異。

如果大家知道更好的漢字轉拼音庫,請推薦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM