漢字轉拼音工具JPinyin的介紹和使用示例

漢字轉拼音的開源工具類包,已經出現過好幾個,好比:Pinyin4J、Jpinyin等。本文主要結合JPinyin漢字轉拼音的Java開源類庫,給出相關的介紹和使用示例。java

Jpinyin介紹

JPinyin是一個漢字轉拼音的Java開源類庫,在PinYin4j的功能基礎上作了一些改進。git

JPinyin主要特性

一、準確、完善的字庫;github

Unicode編碼從4E00-9FA5範圍及3007(〇)的20903個漢字中,JPinyin能轉換除46個異體字(異體字不存在標準拼音)以外的全部漢字;工具

二、拼音轉換速度快;測試

經測試,轉換Unicode編碼從4E00-9FA5範圍的20902個漢字,JPinyin耗時約100毫秒。編碼

三、多拼音格式輸出支持;spa

JPinyin支持多種拼音輸出格式:帶音標、不帶音標、數字表示音標以及拼音首字母輸出格式;code

四、常見多音字識別;orm

JPinyin支持常見多音字的識別,其中包括詞組、成語、地名等;接口

五、簡繁體中文轉換;

六、支持添加用戶自定義字典

上述主要特性摘自Jpinyin的Github頁面

JPinyin原理

JPinyin對漢字轉拼音的支持,主要是經過預約的字典文件實現的。Jpinyin預約義了三個字典文件,以下圖所示:

其中,pinyin.dict文件定義了漢字和對應拼音的鍵值對。部份內容以下:

〇=líng
一=yī
丁=dīng,zhēng
丂=kǎo,qiǎo,yú
七=qī
丄=shàng
丅=xià
丆=hǎn
萬=wàn,mò
丈=zhàng
三=sān
上=shàng,shǎng
下=xià
丌=qí,jī
不=bù,fǒu
與=yǔ,yù,yú
丏=miǎn
丐=gài
醜=chǒu
丒=chǒu
專=zhuān
且=qiě,jū
丕=pī
世=shì
丗=shì
丘=qiū
丙=bǐng
業=yè

... ...

齠=tiáo
齜=zī
齦=yín,kěn
齬=yǔ
齪=chuò
齲=qǔ
齷=wò
龍=lóng,lǒng
龎=páng
龏=gōng,wò
龐=páng
龑=yǎn
龒=lóng
龓=lóng,lǒng
龔=gōng
龕=kān
龖=dá
龗=líng
龘=dá
龍=lóng
龔=gōng
龕=kān
龜=guī,jūn,qiū
龝=qiū
龞=biē
龜=guī,jūn,qiū
龠=yuè
龡=chuī
龢=hé
龣=jiǎo
龤=xié
龥=yuè

multi_pinyin.dict定義了多音字詞語等,部份內容以下:

阿訇=ā,hōng
阿羅漢=ā,luó,hàn
阿木林=ā,mù,lín
阿姨=ā,yí
阿諛=ē,yú
阿附=ē,fù
阿膠=ē,jiāo
阿彌陀佛=ē,mí,tuó,fó
瞭解=liǎo,jiě
瞭如指掌=liǎo,rú,zhǐ,zhǎng
一目瞭然=yī,mù,liǎo,rán
倆人=liǎ,rén
大家倆=nǐ,mēn,liǎ
咱們倆=wǒ,mēn,liǎ
他們倆=tā,mēn,liǎ
子彈=zǐ,dàn
炮彈=pào,dàn
彈藥=dàn,yào
調查=diào,chá
聲調=shēng,diào
音樂=yīn,yuè
樂曲=yuè,qǔ
樂器=yuè,qì
曲譜=yuè,pǔ
縫隙=fèng,xì
胸脯=xiōng,pú

... ...

處方=chǔ,fāng
扒手=pá,shǒu
扒草=pá,cǎo
數據=shù,jù
從新=chóng,xīn
無數=wú,shù
成都=chéng,dū
重來=chóng,lái
重複=chóng,fù
重申=chóng,shēn
重陽=chóng,yáng
重逢=chóng,féng
重沓=chóng,tà
重疊=chóng,dié
重霄=chóng,xiāo
重唱=chóng,chàng
重洋=chóng,yáng
重巒疊嶂=chóng,luán,dié,zhàng
成長=chéng,zhǎng

chinese.dict則定義了繁體字和簡體字對應的鍵值對,用於繁體字和簡體字的轉換,部份內容以下:

臺=臺
萬=萬
與=與
醜=醜
專=專
業=業
叢=叢
東=東
絲=絲
丟=丟
兩=兩
嚴=嚴
喪=喪
個=個
爿=丬
豐=豐
臨=臨
為=爲
麗=麗
舉=舉
麼=麼
義=義
烏=烏
樂=樂

... ... 

齒=齒
齔=齔
齕=齕
齗=齗
齟=齟
齡=齡
齙=齙
齠=齠
齜=齜
齦=齦
齬=齬
齪=齪
齲=齲
齷=齷
龍=龍
龔=龔
龕=龕
龜=龜

有了上述的字典庫,讀取相關的字典資源文件,就能夠完成繁體字到簡體字、漢字到拼音的轉換等功能。

Jpinyin主要類介紹

Jpinyin就包含以下圖所示的6個Java類:

其中,

  • PinyinHelper.java是漢字轉拼音類,其主要有以下幾個功能:
  1. 判斷一個漢字是否爲多音字
  2. 獲取字符串對應拼音的首字母
  3. 將字符串轉換成帶聲調格式的拼音
  4. 將字符串轉換成相應格式的拼音
  5. 將單個漢字轉換爲相應格式的拼音
  6. 等等
  • ChineseHelper.java是漢字簡繁體轉換類,其主要有以下幾個功能:
  1. 將單個繁體字轉換爲簡體字
  2. 將單個簡體字轉換爲繁體字
  3. 判斷某個字符是否爲漢字
  4. 判斷字符串中是否包含中文
  5. 等等
  • PinyinFormat.java是拼音格式類,主要提供了三種拼音格式類:
  1. WITH_TONE_MARK 
  2. WITHOUT_TONE
  3. WITH_TONE_NUMBER
package com.github.stuxuhai.jpinyin;

/**
 * 拼音格式類
 *
 * @author stuxuhai (dczxxuhai@gmail.com)
 */
public enum PinyinFormat {
    WITH_TONE_MARK, WITHOUT_TONE, WITH_TONE_NUMBER;
}
  • PinyinResource.java是資源文件加載類,主要提供對預約義的字典文件進行加載。
protected static Map<String, String> getPinyinResource() {
        return getResource(newClassPathReader("/data/pinyin.dict"));
    }

    protected static Map<String, String> getMutilPinyinResource() {
        return getResource(newClassPathReader("/data/mutil_pinyin.dict"));
    }

    protected static Map<String, String> getChineseResource() {
        return getResource(newClassPathReader("/data/chinese.dict"));
    }

Jpinyin使用示例

漢字簡繁體互轉

/**
		 * 簡體字和繁體字互轉
		 */
		// 義 --> 義
		System.out.println(ChineseHelper.convertToTraditionalChinese('義'));
		// 義 --> 義
		System.out.println(ChineseHelper.convertToSimplifiedChinese('義'));

		// 東無敵 --> 東無敵
		System.out.println(ChineseHelper.convertToTraditionalChinese("東無敵"));
		// 東無敵 --> 東無敵
		System.out.println(ChineseHelper.convertToSimplifiedChinese("東無敵"));

判斷是否爲中文字符

/**
		 * 判斷是否爲中文字符
		 */
		System.out.println(ChineseHelper.isChinese('A')); // false
		System.out.println(ChineseHelper.isChinese('東')); // true
		System.out.println(ChineseHelper.isChinese('東')); // true

判斷是否爲繁體字

/**
		 * 是否爲繁體字
		 */
		System.out.println(ChineseHelper.isTraditionalChinese('東')); // false
		System.out.println(ChineseHelper.isTraditionalChinese('東')); // true

判斷是否包含中文字符

/**
		 * 判斷是否包含中文字符
		 */
		System.out.println(ChineseHelper.containsChinese("ABC")); // false
		System.out.println(ChineseHelper.containsChinese("A東C")); // true
		System.out.println(ChineseHelper.containsChinese("A東C")); // true
	}

漢字簡繁轉換類的完整示例

import com.github.stuxuhai.jpinyin.ChineseHelper;

/**
 * 
 * @author wangmengjun
 *
 */
public class ChineseHelperExample {

	public static void main(String[] args) {
		/**
		 * 簡體字和繁體字互轉
		 */
		// 義 --> 義
		System.out.println(ChineseHelper.convertToTraditionalChinese('義'));
		// 義 --> 義
		System.out.println(ChineseHelper.convertToSimplifiedChinese('義'));

		// 東無敵 --> 東無敵
		System.out.println(ChineseHelper.convertToTraditionalChinese("東無敵"));
		// 東無敵 --> 東無敵
		System.out.println(ChineseHelper.convertToSimplifiedChinese("東無敵"));

		/**
		 * 判斷是否爲中文字符
		 */
		System.out.println(ChineseHelper.isChinese('A')); // false
		System.out.println(ChineseHelper.isChinese('東')); // true
		System.out.println(ChineseHelper.isChinese('東')); // true

		/**
		 * 是否爲繁體字
		 */
		System.out.println(ChineseHelper.isTraditionalChinese('東')); // false
		System.out.println(ChineseHelper.isTraditionalChinese('東')); // true

		/**
		 * 判斷是否包含中文字符
		 */
		System.out.println(ChineseHelper.containsChinese("ABC")); // false
		System.out.println(ChineseHelper.containsChinese("A東C")); // true
		System.out.println(ChineseHelper.containsChinese("A東C")); // true
	}
}

獲取某個中文字符可能的發音

/**
		 * 獲取某個中文字符可能的發音,如 爲能夠有兩種發音[wèi, wéi]
		 */
		String[] weiArray = PinyinHelper.convertToPinyinArray('爲');
		// [wèi, wéi]
		System.out.println(Arrays.toString(weiArray));

		/**
		 * 沒有音調
		 */
		String[] weiArrayWithoutTone = PinyinHelper.convertToPinyinArray('爲',
				PinyinFormat.WITHOUT_TONE);
		//[wei]
		System.out.println(Arrays.toString(weiArrayWithoutTone));
		
		/**
		 * 有音調,使用數字表示音調
		 */
		String[] weiArrayWithoutToneNum= PinyinHelper.convertToPinyinArray('爲',
				PinyinFormat.WITH_TONE_NUMBER);
		//[wei4, wei2]
		System.out.println(Arrays.toString(weiArrayWithoutToneNum));

獲取字符串對應拼音的首字母

/**
		 * 獲取字符串對應拼音的首字母
		 */
		try {
			String shortPinyin = PinyinHelper.getShortPinyin("我愛杭州");
			//wahz
			System.out.println(shortPinyin);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

將字符串轉換成相應格式的拼音

/**
		 * 將字符串轉換成相應格式的拼音
		 */
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_MARK);
			//háng,zhōu,xī,hú
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITHOUT_TONE);
			//hang,zhou,xi,hu
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_NUMBER);
			//hang2,zhou1,xi1,hu2
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

漢字轉拼音類完整示例

import java.util.Arrays;

import com.github.stuxuhai.jpinyin.PinyinException;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;


/**
 * @author wangmengjun
 *
 */
public class PinyinHelperExample {

	public static void main(String[] args) {

		/**
		 * 獲取某個中文字符可能的發音,如 爲能夠有兩種發音[wèi, wéi]
		 */
		String[] weiArray = PinyinHelper.convertToPinyinArray('爲');
		// [wèi, wéi]
		System.out.println(Arrays.toString(weiArray));

		/**
		 * 沒有音調
		 */
		String[] weiArrayWithoutTone = PinyinHelper.convertToPinyinArray('爲',
				PinyinFormat.WITHOUT_TONE);
		//[wei]
		System.out.println(Arrays.toString(weiArrayWithoutTone));
		
		/**
		 * 有音調,使用數字表示音調
		 */
		String[] weiArrayWithoutToneNum= PinyinHelper.convertToPinyinArray('爲',
				PinyinFormat.WITH_TONE_NUMBER);
		//[wei4, wei2]
		System.out.println(Arrays.toString(weiArrayWithoutToneNum));
		
		/**
		 * 獲取字符串對應拼音的首字母
		 */
		try {
			String shortPinyin = PinyinHelper.getShortPinyin("我愛杭州");
			//wahz
			System.out.println(shortPinyin);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		/**
		 * 將字符串轉換成相應格式的拼音
		 */
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_MARK);
			//háng,zhōu,xī,hú
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITHOUT_TONE);
			//hang,zhou,xi,hu
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_NUMBER);
			//hang2,zhou1,xi1,hu2
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

小結

本文對漢字轉拼音開源工具Jpinyin進行了簡單的介紹,並給出了幾個例子。

從使用上來看,Jpinyin的使用還算便利,並且Jpinyin還預留了支持添加用戶自定義字典的接口,可讓用戶根據自身特色來自定義字典,從而去知足自身業務特色或者功能,如:

PinyinHelper.addPinyinDict("user.dict");  // 添加用戶自定義字典
相關文章
相關標籤/搜索