利用 pinyin4j 把漢字轉化爲拼音

1.     簡單介紹

有時候,需要將漢字編程對應的拼音,以方便數據的處理。比如在Android手機應用的開發上,要查詢聯繫人的姓名,通常都是用拼音進行查詢的。比如要查詢“曹孟德”,就可以輸入“cmd”,即“曹孟德”三個漢字的拼音“caomengde”各字的首字母。但是怎樣才能將“曹孟德”翻譯成“caomengde”呢?很簡單的辦法就是建立一個大的對照表(比如用關聯容器Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但這樣的做法,需要維護好一個比較大的對照表,同時一個漢字可能有多個發音,也就是說Map這樣的容器是不行的,因爲其<key,value>必須是一一對應的。

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

  • 支持同一漢字有多個發音
  • 還支持拼音的格式化輸出,比如第幾聲之類的,
  • 同時支持簡體中文、繁體中文轉換爲拼音…使用起來也非常簡單。

下面是其官方網址,其中提供了下載:

http://pinyin4j.sourceforge.net/

 

2.     基本用法:

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

<pre name="code" class="java">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);
設置聲調格式:setToneType 

HanyuPinyinToneType.WITH_TONE_MARK      用聲調符號表示,例如huáng

HanyuPinyinToneType.WITH_TONE_NUMBER  用數字表示聲調,例如:huang2

HanyuPinyinToneType.WITHOUT_TONE           無聲調錶示,例如:huang


設置特殊拼音ü的顯示格式:setVCharType

HanyuPinyinVCharType.WITH_U_UNICODE             以U表示該拼音, 

HanyuPinyinVCharType.WITH_U_AND_COLON       以U和一個冒號表示該拼音, 

HanyuPinyinVCharType.WITH_V                             以V表示該字符,


設置大小寫格式:setCaseType

HanyuPinyinCaseType.LOWERCASE                   轉換後以全小寫方式輸出

HanyuPinyinCaseType.UPPERCASE                    轉換後以全大寫方式輸出

		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]);
		}


4.    實際示例代碼

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

<pre name="code" class="java">class HanYu {
	private HanyuPinyinOutputFormat format = null;
	private String[] pinyin;
	public HanYu()
	{
		format = new HanyuPinyinOutputFormat();
		format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
		format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
		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();
	}
}


//測試代碼
HanYu hanyu = new HanYu();
// 中英文混合的一段文字
String str = "少壯不努力老了學計算機,study hard hard,day day up";
String strPinyin = hanyu.getStringPinYin(str);
System.out.println(strPinyin);


打印結果:
shăo zhuàng bù nŭ lì lăo le xué jì suàn jī ,study hard hard,day day up
發佈了40 篇原創文章 · 獲贊 17 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章