最近要实现一个根据词语得到词语对应拼音的功能,找到了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的实现原理是通过将生字、词组和对应的拼音以及简繁汉字存放在数据库,然后通过代码操作数据库来实现汉字/词组转拼音和汉字简繁互转的,数据库都是加密的,不能扩充,但这个工具已经比较完善了,没有必要自己去扩充数据库,经本人测试,未发现有转换错误的问题。
三、核心方法说明:
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程序,实现对汉字转拼音各接口的调用,使用起来非常简单。
-
public class JPinyinDemoActivity extends BaseActivity { -
@Override -
public void setContentView() { -
setContentView(R.layout.activity_jpinyin_demo_layout); -
} -
@Override -
public void findViews() { -
mWordsEditTxt = ( EditText )findViewById(R.id.wordsEditTextId); -
mResultTxt = ( TextView )findViewById(R.id.resultTxtId); -
InputLenLimit.lengthFilter( this, mWordsEditTxt ); -
} -
@Override -
public void getData() { -
} -
@Override -
public void showContent() { -
testJPinyin( ); -
} -
public void onClick( View v ){ -
switch( v.getId( ) ){ -
case R.id.toPinyinBtnId:{ -
clickWordsToPinyin( ); -
} -
break; -
default:{ -
} -
break; -
} -
} -
private String wordsToPinyin( String words ){ -
if( TextUtils.isEmpty( words ) ){ -
return null; -
} -
String pinyin = PinyinHelper.convertToPinyinString( words, " "); -
return pinyin; -
} -
private void clickWordsToPinyin( ){ -
String pinyin = wordsToPinyin( mWordsEditTxt.getText( ).toString( ) ); -
if( !TextUtils.isEmpty( pinyin ) ){ -
mResultTxt.setText( pinyin ); -
} -
} -
private void testJPinyin( ){ -
String words = "和气生财"; -
boolean hasMultiPinyin = false; -
String pinyin = null; -
String[] pinyins = null; -
final String separator = " "; -
// hé qì shēng cái -
pinyin = PinyinHelper.convertToPinyinString(words, separator); -
println( pinyin ); -
// WITH_TONE_NUMBER--数字代表声调,WITHOUT_TONE--不带声调,WITH_TONE_MARK--带声调 -
// hé qì shēng cái -
pinyin = PinyinHelper.convertToPinyinString(words, separator, PinyinFormat.WITH_TONE_MARK); -
println( pinyin ); -
// he2 qi4 sheng1 cai2 -
pinyin = PinyinHelper.convertToPinyinString(words, separator, PinyinFormat.WITH_TONE_NUMBER); -
println( pinyin ); -
// he qi sheng cai -
pinyin = PinyinHelper.convertToPinyinString(words, separator, PinyinFormat.WITHOUT_TONE); -
println( pinyin ); -
// hé hè huó huò hú -
pinyins = PinyinHelper.convertToPinyinArray( words.toCharArray()[ 0 ] ); -
println( pinyins ); -
// hé hè huó huò hú -
pinyins = PinyinHelper.convertToPinyinArray( words.toCharArray()[ 0 ], PinyinFormat.WITH_TONE_MARK ); -
println( pinyins ); -
// hqsc -
pinyin = PinyinHelper.getShortPinyin( words ); -
println( pinyin ); -
// true -
hasMultiPinyin = PinyinHelper.hasMultiPinyin( words.toCharArray( )[ 0 ] ); -
println( hasMultiPinyin ); -
} -
private void println( String result ){ -
System.out.println( "result == " + result ); -
} -
private void println( String[] results ){ -
for( String result : results ){ -
System.out.println( "result == " + result + " " ); -
} -
} -
private void println( boolean hasMultiPinyin ){ -
System.out.println( "result == " + hasMultiPinyin ); -
} -
private TextView mResultTxt = null; -
private EditText mWordsEditTxt = null;