1. 簡單介紹編程
有時候,須要將漢字編程對應的拼音,以方便數據的處理。好比在Android手機應用的開發上,要查詢聯繫人的姓名,一般都是用拼音進行查詢的。好比要查詢「曹孟德」,就能夠輸入「cmd」,即「曹孟德」三個漢字的拼音「caomengde」各字的首字母。可是怎樣才能將「曹孟德」翻譯成「caomengde」呢?很簡單的辦法就是創建一個大的對照表(好比用關聯容器Map),好比<」曹」,」cao」>,<」 孟」,」meng」>,<」 德」,」de」>…但這樣的作法,須要維護好一個比較大的對照表,同時一個漢字可能有多個發音,也就是說Map這樣的容器時不行的,由於其<key,value>必須是一一對應的。在C++中能夠用STL裏面的multimap來解決這個問題,但Java中沒有相似multimap這樣的東西,除非本身實現一個。數組
Pinyin4j就是爲了解決相似這樣的問題的。它是sourceforge.net上的一個開源項目,功能很是強大:app
+ 支持同一漢字有多個發音ui
+ 還支持拼音的格式化輸出,好比第幾聲之類的,spa
+ 同時支持簡體中文、繁體中文轉換爲拼音…使用起來也很是簡單。下面是其官方網址,其中提供了下載:.net
http://pinyin4j.sourceforge.net/翻譯
2. 基本用法:orm
一般狀況下,只須要用到其中的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。