最近要实现一个根据词语得到词语对应拼音的功能,找到了Jpinyin这个开源工具包,使用下来发现它非常强大,完全满足我的需求,下面对它做一个简单的介绍,希望能够帮助到有需要的朋友。

https://github.com/stuxuhai/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是一个汉字转拼音的Java开源类库

 

二、实现原理:

        通过阅读源代码发现,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.  
  7. @Override

  8. public void findViews() {

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

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

  11.  
  12. InputLenLimit.lengthFilter( this, mWordsEditTxt );

  13. }

  14.  
  15. @Override

  16. public void getData() {

  17.  
  18. }

  19.  
  20. @Override

  21. public void showContent() {

  22. testJPinyin( );

  23. }

  24.  
  25. public void onClick( View v ){

  26. switch( v.getId( ) ){

  27. case R.id.toPinyinBtnId:{

  28. clickWordsToPinyin( );

  29. }

  30. break;

  31. default:{

  32.  
  33. }

  34. break;

  35. }

  36. }

  37.  
  38. private String wordsToPinyin( String words ){

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

  40. return null;

  41. }

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

  44.  
  45. return pinyin;

  46. }

  47.  
  48. private void clickWordsToPinyin( ){

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

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

  51. mResultTxt.setText( pinyin );

  52. }

  53. }

  54.  
  55. private void testJPinyin( ){

  56. String words = "和气生财";

  57. boolean hasMultiPinyin = false;

  58. String pinyin = null;

  59. String[] pinyins = null;

  60. final String separator = " ";

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

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

  64. println( pinyin );

  65.  
  66. // WITH_TONE_NUMBER--数字代表声调,WITHOUT_TONE--不带声调,WITH_TONE_MARK--带声调

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

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

  69. println( pinyin );

  70.  
  71. // he2 qi4 sheng1 cai2

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

  73. println( pinyin );

  74.  
  75. // he qi sheng cai

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

  77. println( pinyin );

  78.  
  79. // hé hè huó huò hú

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

  81. println( pinyins );

  82.  
  83. // hé hè huó huò hú

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

  85. println( pinyins );

  86.  
  87. // hqsc

  88. pinyin = PinyinHelper.getShortPinyin( words );

  89. println( pinyin );

  90.  
  91. // true

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

  93. println( hasMultiPinyin );

  94. }

  95.  
  96. private void println( String result ){

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

  98. }

  99.  
  100. private void println( String[] results ){

  101. for( String result : results ){

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

  103. }

  104. }

  105.  
  106. private void println( boolean hasMultiPinyin ){

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

  108. }

  109.  
  110. private TextView mResultTxt = null;

  111. private EditText mWordsEditTxt = null;

posted on 2018-07-19 17:02  刘达人186  阅读(383)  评论(0编辑  收藏  举报