閱讀927 返回首頁    go iPhone_iPad_Mac_apple


java對漢字和漢語拚音的操作——Pinyin4j的基本用法

 

1.     簡單介紹

 

有時候,需要將漢字編程對應的拚音,以方便數據的處理。比如在Android手機應用的開發上,要查詢聯係人的姓名,通常都是用拚音進行查詢的。比如要查詢“曹孟德”,就可以輸入“cmd”,即“曹孟德”三個漢字的拚音 “caomengde”各字的首字母。但是怎樣才能將“曹孟德”翻譯成“caomengde”呢?很簡單的辦法就是建立一個大的對照表(比如用關聯容器 Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但這樣的做法,需要維護好一個比較大的對照表,同時一個漢字可能有多個發音,也就是說Map這樣的容器時不行的,因為其<key,value>必須是一一對應的。在C++中可以用STL裏麵的multimap來解決這個問題,但Java中沒有類似 multimap這樣的東西,除非自己實現一個。

 

Pinyin4j就是為了解決類似這樣的問題的。它是sourceforge.net上的一個開源項目,功能非常強大:

+ 支持同一漢字有多個發音

+ 還支持拚音的格式化輸出,比如第幾聲之類的,

+ 同時支持簡體中文、繁體中文轉換為拚音…使用起來也非常簡單。

 

下麵是其官方網址,其中提供了下載:https://pinyin4j.sourceforge.net/

 

 

2.     基本用法:

 

通常情況下,隻需要用到其中的PinyinHelper類中的靜態方法toHanyuPinyinStringArray就可以了,比如:

 

String[] pinyinArray =PinyinHelper.toHanyuPinyinStringArray('單');

for(int i = 0; i < pinyinArray.length; ++i)

{

         System.out.println(pinyinArray[i]);

}

 

輸出結果

dan1

chan2

shan4

 

這三種發音,後麵的數字代表第幾聲。可以看到靜態方法 toHanyuPinyinStringArray返回的數據類型是一個String數組,它用來接收一個漢字的多個發音,如果 toHanyuPinyinStringArray中的參數不是漢字,那麼它會返回null。

 

 

3.    格式支持

 

Pinyin4j支持拚音輸出的格式化,比如,“黃”可以輸出為“huang”、“huang2”、“huáng”等等,下麵的代碼就似是輸出“huáng”的示例:

 

HanyuPinyinOutputFormat format= new HanyuPinyinOutputFormat();

format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);

format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);

                 

String[] pinyinArray = null;

try

{

         pinyinArray = PinyinHelper.toHanyuPinyinStringArray('黃', format);

}

catch(BadHanyuPinyinOutputFormatCombination e)

{

         e.printStackTrace();

}

for(int i = 0; i < pinyinArray.length; ++i)

{

         System.out.println(pinyinArray[i]);

}

 

此外,還支持大小寫轉換、ü等等。詳細情況,可以查看Pinyin4j自帶的文檔。

 

4.    實際示例代碼

 

如果我們要將一段文字中的漢字全部轉換成不帶音調的拚音輸出,而這段文字中又可能包含阿拉伯數字、英文、標點符號等等。如果完全靠自己寫代碼進行轉換,那是非常麻煩的,其中一個首先就要區別,這段文字中那些是漢字,那些是非漢字。有了 Pinyin4j,這個問題就不再困難了,因為對於非漢字,Pinyin4j會自動輸出null。參考下麵的示例代碼:


 

importnet.sourceforge.pinyin4j.*;

importnet.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;

importnet.sourceforge.pinyin4j.format.HanyuPinyinToneType;

importnet.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

 

public class Chinese2PY

{

         public static void main(String[] args)

         {      

                   Hanyu hanyu = new Hanyu();

                   // 中英文混合的一段文字

                   String str = "荊溪白石出,Hello 天寒紅葉稀。Android 山路元無雨,What's up?   空翠濕人衣。";

                   String strPinyin = hanyu.getStringPinYin(str);

                   System.out.println(strPinyin);

         }

}

 

class Hanyu

{

         private HanyuPinyinOutputFormat format = null;

         private String[] pinyin;

       

         public Hanyu()

         {

                   format = new HanyuPinyinOutputFormat();

                   format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

                 

                   pinyin = null;

         }

       

         //轉換單個字符

         public String getCharacterPinYin(char c)

         {

                   try

                   {

                            pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);

                   }

                   catch(BadHanyuPinyinOutputFormatCombination e)

                   {

                            e.printStackTrace();

                   }

                 

                   // 如果c不是漢字,toHanyuPinyinStringArray會返回null

                   if(pinyin == null) return null;

                 

                   // 隻取一個發音,如果是多音字,僅取第一個發音

                   return pinyin[0];  

         }

       

         //轉換一個字符串

         public String getStringPinYin(String str)

         {

                   StringBuilder sb = new StringBuilder();

                   String tempPinyin = null;

                   for(int i = 0; i < str.length(); ++i)

                   {

                            tempPinyin =getCharacterPinYin(str.charAt(i));

                            if(tempPinyin == null)

                            {

                                     // 如果str.charAt(i)非漢字,則保持原樣

                                     sb.append(str.charAt(i));

                            }

                            else

                            {

                                     sb.append(tempPinyin);

                            }

                   }

                   return sb.toString();

         }

}

 

輸出結果:

 

jingxibaishichu,Hellotianhanhongyexi。Android shanluyuanwuyu,What'sup?   kongcuishirenyi。


 

原帖地址:https://www.open-open.com/home/space-2869-do-blog-id-5493.html

最後更新:2017-04-02 18:44:44

  上一篇:go 做了個軟連接,結果,陷入了死循環
  下一篇:go 折半查找