最近要實現一個根據詞語得到詞語對應拼音的功能,找到了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;
}