在某些场景中,可能为了方便用户快速搜索,使用拼音首字母的方式进行检索。举个例子,一个系统支持拼音首字母检索,那么输入hzlj就可以搜索出杭州龙井等商品结果,系统中提供一个字段用于存储拼音字母组合即可。(呃~~,在这里我们不讨论为什么不用索引进行检索等,只是给出一个case说明)。
本文将给大家介绍一个自己曾经用过的,感觉还不错的汉字转拼音的java开源类包JPinYin。
本文主要包含如下几个部分的内容:
1、JPinYin的基本介绍
2、JPinYin的基本原理和组成
3、使用JPinYin完成多个case的示例
一、JPinYin的基本介绍
JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。
1.1 JPinYin的基本特性
## https://github.com/qzw1210/jpinyin
1、准确、完善的字库;
Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,
JPinyin能转换除46个异体字(异体字不存在标准拼音)之外的所有汉字;
2、拼音转换速度快;
经测试,转换Unicode编码从4E00-9FA5范围的20902个汉字,
JPinyin耗时约100毫秒。
3、多拼音格式输出支持;
JPinyin支持多种拼音输出格式:带音标、不带音标、数字表示音标
以及拼音首字母输出格式;
4、常见多音字识别;
JPinyin支持常见多音字的识别,其中包括词组、成语、地名等;
5、简繁体中文转换;
6、支持添加用户自定义字典;
二、JPinYin的基本原理和组成
2.1 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则定义了繁体字和简体字对应的键值对,用于繁体字和简体字的转换,部分内容如下:
臺=台
萬=万
與=与
醜=丑
專=专
業=业
叢=丛
東=东
絲=丝
丟=丢
兩=两
嚴=严
喪=丧
個=个
爿=丬
豐=丰
臨=临
為=为
麗=丽
舉=举
麼=么
義=义
烏=乌
樂=乐
...
齒=齿
齔=龀
齕=龁
齗=龂
齟=龃
齡=龄
齙=龅
齠=龆
齜=龇
齦=龈
齬=龉
齪=龊
齲=龋
齷=龌
龍=龙
龔=龚
龕=龛
龜=龟
有了上述的字典库,读取相关的字典资源文件,就可以完成繁体字到简体字、汉字到拼音的转换等功能。
2.2JPinYin基本组成
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"));
}
三、JPinYin的多个示例
接下来,我们将使用JPinYin来完成多个示例,先引入依赖包:
<groupId>com.github.stuxuhai</groupId>
jpinyin</artifactId>
1.1.7</version>
</dependency>
3.1 汉字简繁体互转
/**
* 简体字和繁体字互转
*/
// 义 --> 義
System.out.println(ChineseHelper.convertToTraditionalChinese('义'));
// 義 --> 义
System.out.println(ChineseHelper.convertToSimplifiedChinese('義'));
// 东无敌 --> 東無敵
System.out.println(ChineseHelper.convertToTraditionalChinese("东无敌"));
// 東無敵 --> 东无敌
System.out.println(ChineseHelper.convertToSimplifiedChinese("東無敵"));
3.2判断是否为中文字符
/**
* 判断是否为中文字符
*/
System.out.println(ChineseHelper.isChinese('A')); // false
System.out.println(ChineseHelper.isChinese('东')); // true
System.out.println(ChineseHelper.isChinese('東')); // true
3.3判断是否为繁体字
/**
* 是否为繁体字
*/
System.out.println(ChineseHelper.isTraditionalChinese('东')); // false
System.out.println(ChineseHelper.isTraditionalChinese('東')); // true
3.4判断是否包含中文字符
/**
* 判断是否包含中文字符
*/
System.out.println(ChineseHelper.containsChinese("ABC")); // false
System.out.println(ChineseHelper.containsChinese("A东C")); // true
System.out.println(ChineseHelper.containsChinese("A東C")); // true
3.5获取某个中文字符可能的发音
/**
* 获取某个中文字符可能的发音,如 为可以有两种发音[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));
3.6获取字符串对应拼音的首字母
/**
* 获取字符串对应拼音的首字母
*/
try {
String shortPinyin = PinyinHelper.getShortPinyin("我爱杭州");
//wahz
System.out.println(shortPinyin);
} catch (PinyinException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.7将字符串转换成相应格式的拼音
/**
* 将字符串转换成相应格式的拼音
*/
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"); // 添加用户自定义字典
有兴趣的读者可以自己尝试一下。
———END———
限 时 特 惠: 本站每日持续更新海量各大最新【内部创业教程】,一年会员只需 98 元,全站资源免费下载 点击查看详情
站 长 微 信: webprojs_com