漢字轉拼音的開源工具類包,已經出現過好幾個,好比:Pinyin4J、Jpinyin等。本文主要結合JPinyin漢字轉拼音的Java開源類庫,給出相關的介紹和使用示例。java
JPinyin是一個漢字轉拼音的Java開源類庫,在PinYin4j的功能基礎上作了一些改進。git
一、準確、完善的字庫;github
Unicode編碼從4E00-9FA5範圍及3007(〇)的20903個漢字中,JPinyin能轉換除46個異體字(異體字不存在標準拼音)以外的全部漢字;工具
二、拼音轉換速度快;測試
經測試,轉換Unicode編碼從4E00-9FA5範圍的20902個漢字,JPinyin耗時約100毫秒。編碼
三、多拼音格式輸出支持;spa
JPinyin支持多種拼音輸出格式:帶音標、不帶音標、數字表示音標以及拼音首字母輸出格式;code
四、常見多音字識別;orm
JPinyin支持常見多音字的識別,其中包括詞組、成語、地名等;接口
五、簡繁體中文轉換;
六、支持添加用戶自定義字典;
上述主要特性摘自Jpinyin的Github頁面。
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就包含以下圖所示的6個Java類:
其中,
- 判斷一個漢字是否爲多音字
- 獲取字符串對應拼音的首字母
- 將字符串轉換成帶聲調格式的拼音
- 將字符串轉換成相應格式的拼音
- 將單個漢字轉換爲相應格式的拼音
- 等等
- 將單個繁體字轉換爲簡體字
- 將單個簡體字轉換爲繁體字
- 判斷某個字符是否爲漢字
- 判斷字符串中是否包含中文
- 等等
- WITH_TONE_MARK
- WITHOUT_TONE
- WITH_TONE_NUMBER
package com.github.stuxuhai.jpinyin; /** * 拼音格式類 * * @author stuxuhai (dczxxuhai@gmail.com) */ public enum PinyinFormat { WITH_TONE_MARK, WITHOUT_TONE, WITH_TONE_NUMBER; }
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")); }
/** * 簡體字和繁體字互轉 */ // 義 --> 義 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"); // 添加用戶自定義字典