汉字转拼音的开源工具类包,已经出现过好几个,好比: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"); // 添加用户自定义字典