1. 程式人生 > >漢字轉拼音開源工具包Jpinyin介紹

漢字轉拼音開源工具包Jpinyin介紹

      最近要實現一個根據詞語得到詞語對應拼音的功能,找到了Jpinyin這個開源工具包,使用下來發現它非常強大,完全滿足我的需求,下面對它做一個簡單的介紹,希望能夠幫助到有需要的朋友。

一、專案介紹:

        JPinyin是一個漢字轉拼音的Java開源類庫,在PinYin4j的功能基礎上做了一些改進。


        【JPinyin主要特性】
1、準確、完善的字型檔;
        Unicode編碼從4E00-9FA5範圍及3007(〇)的20903個漢字中,JPinyin能轉換除46個異體字(異體字不存在標準拼音)之外的所有漢字;
2、拼音轉換速度快;
        經測試,轉換Unicode編碼從4E00-9FA5範圍的20902個漢字,JPinyin耗時約100毫秒。
3、多拼音格式輸出支援;
        JPinyin支援多種拼音輸出格式:帶音標、不帶音標、數字表示音標以及拼音首字母輸出格式;
4、常見多音字識別;
        JPinyin支援常見多音字的識別,其中包括片語、成語、地名等;
5、簡繁體中文轉換
 

二、實現原理:

        通過閱讀原始碼發現,JPinyin的實現原理是通過將生字、片語和對應的拼音以及簡繁漢字存放在資料庫,然後通過程式碼操作資料庫來實現漢字/片語轉拼音和漢字簡繁互轉的,資料庫都是加密的,不能擴充,但這個工具已經比較完善了,沒有必要自己去擴充資料庫,經本人測試,未發現有轉換錯誤的問題。

三、核心方法說明:

Jpinyin裡面一共有四個類:

ChineseHelper.java     漢字簡繁體轉換類

PinyinFormat.java         拼音格式類

PinyinHelper.java          漢字轉拼音類

PinyinResource.java    資原始檔載入類

        本文只介紹漢字轉拼音PinyinHelper,簡繁轉換ChineseHelper不作介紹,其中PinyinHelper的公用介面如下:

/**

 * 將單個漢字轉換為相應格式的拼音
 * @param c 需要轉換成拼音的漢字
 * @param pinyinFormat 拼音格式:WITH_TONE_NUMBER--數字代表聲調,WITHOUT_TONE--不帶聲調,WITH_TONE_MARK--帶聲調
 * @return 漢字的拼音
 */
public static String[] convertToPinyinArray(char c, PinyinFormat pinyinFormat)




/**
 * 將單個漢字轉換成帶聲調格式的拼音
 * @param c 需要轉換成拼音的漢字
 * @return 字串的拼音
 */
public static String[] convertToPinyinArray(char c)


/**
 * 將字串轉換成相應格式的拼音
 * @param str 需要轉換的字串
 * @param separator 拼音分隔符
 * @param pinyinFormat 拼音格式:WITH_TONE_NUMBER--數字代表聲調,WITHOUT_TONE--不帶聲調,WITH_TONE_MARK--帶聲調
 * @return 字串的拼音
 */
public static String convertToPinyinString(String str, String separator, PinyinFormat pinyinFormat)


/**
 * 將字串轉換成帶聲調格式的拼音
 * @param str 需要轉換的字串
 * @param separator 拼音分隔符
 * @return 轉換後帶聲調的拼音
 */
public static String convertToPinyinString(String str, String separator)


/**
 * 判斷一個漢字是否為多音字
 * @param c 漢字
 * @return 判斷結果,是漢字返回true,否則返回false
 */
public static boolean hasMultiPinyin(char c)


/**
 * 獲取字串對應拼音的首字母
 * @param str 需要轉換的字串
 * @return 對應拼音的首字母
 */
public static String getShortPinyin(String str)


四、Demo

        下面是我寫的一個demo程式,實現對漢字轉拼音各介面的呼叫,使用起來非常簡單。

  1. public class JPinyinDemoActivity extends BaseActivity {

  2. @Override

  3. public void setContentView() {

  4. setContentView(R.layout.activity_jpinyin_demo_layout);

  5. }

  6. @Override

  7. public void findViews() {

  8. mWordsEditTxt = ( EditText )findViewById(R.id.wordsEditTextId);

  9. mResultTxt = ( TextView )findViewById(R.id.resultTxtId);

  10. InputLenLimit.lengthFilter( this, mWordsEditTxt );

  11. }

  12. @Override

  13. public void getData() {

  14. }

  15. @Override

  16. public void showContent() {

  17. testJPinyin( );

  18. }

  19. public void onClick( View v ){

  20. switch( v.getId( ) ){

  21. case R.id.toPinyinBtnId:{

  22. clickWordsToPinyin( );

  23. }

  24. break;

  25. default:{

  26. }

  27. break;

  28. }

  29. }

  30. private String wordsToPinyin( String words ){

  31. if( TextUtils.isEmpty( words ) ){

  32. return null;

  33. }

  34. String pinyin = PinyinHelper.convertToPinyinString( words, " ");

  35. return pinyin;

  36. }

  37. private void clickWordsToPinyin( ){

  38. String pinyin = wordsToPinyin( mWordsEditTxt.getText( ).toString( ) );

  39. if( !TextUtils.isEmpty( pinyin ) ){

  40. mResultTxt.setText( pinyin );

  41. }

  42. }

  43. private void testJPinyin( ){

  44. String words = "和氣生財";

  45. boolean hasMultiPinyin = false;

  46. String pinyin = null;

  47. String[] pinyins = null;

  48. final String separator = " ";

  49. // hé qì shēng cái

  50. pinyin = PinyinHelper.convertToPinyinString(words, separator);

  51. println( pinyin );

  52. // WITH_TONE_NUMBER--數字代表聲調,WITHOUT_TONE--不帶聲調,WITH_TONE_MARK--帶聲調

  53. // hé qì shēng cái

  54. pinyin = PinyinHelper.convertToPinyinString(words, separator, PinyinFormat.WITH_TONE_MARK);

  55. println( pinyin );

  56. // he2 qi4 sheng1 cai2

  57. pinyin = PinyinHelper.convertToPinyinString(words, separator, PinyinFormat.WITH_TONE_NUMBER);

  58. println( pinyin );

  59. // he qi sheng cai

  60. pinyin = PinyinHelper.convertToPinyinString(words, separator, PinyinFormat.WITHOUT_TONE);

  61. println( pinyin );

  62. // hé hè huó huò hú

  63. pinyins = PinyinHelper.convertToPinyinArray( words.toCharArray()[ 0 ] );

  64. println( pinyins );

  65. // hé hè huó huò hú

  66. pinyins = PinyinHelper.convertToPinyinArray( words.toCharArray()[ 0 ], PinyinFormat.WITH_TONE_MARK );

  67. println( pinyins );

  68. // hqsc

  69. pinyin = PinyinHelper.getShortPinyin( words );

  70. println( pinyin );

  71. // true

  72. hasMultiPinyin = PinyinHelper.hasMultiPinyin( words.toCharArray( )[ 0 ] );

  73. println( hasMultiPinyin );

  74. }

  75. private void println( String result ){

  76. System.out.println( "result == " + result );

  77. }

  78. private void println( String[] results ){

  79. for( String result : results ){

  80. System.out.println( "result == " + result + " " );

  81. }

  82. }

  83. private void println( boolean hasMultiPinyin ){

  84. System.out.println( "result == " + hasMultiPinyin );

  85. }

  86. private TextView mResultTxt = null;

  87. private EditText mWordsEditTxt = null;