J2EE 使用pinyin4j实现汉字转换拼音

由于项目需求,要求用户输入中文姓名自动转换成拼音,找到了pinyin4j学习了一下。

很多地方都又见到需要这个功能,所以在这里记录一下学习笔记。

这里也是按照我学习的顺序记录。可以理解成为倒叙,不知道这种方法好不好理解,

如果不太好理解我再正过来。

看了api发现PinyinHelper这个类里面的方法很适合我,所以只研究了一下这个。

研究了这个转换拼音的才发现原来拼音有好多种,而且是国际通用的,很神奇

里面的方法大概分为转换HanyuPinyin、YalePinyin、TongyongPinyin、WadeGilesPinyin

然后去差了一下区别,基本确定HanyuPinyin就是我们平时接触的拼音,也就是我需要的。

toHanyuPinyinStringArray(char ch)
toHanyuPinyinStringArray(char ch,HanyuPinyinOutputFormat outputFormat)
这两个方法应该就是我想要的。

第一个很通俗易懂参数为字符于是试了一下。

String nameString = "和";
char[] hanyu= nameString.trim().toCharArray();//将字符串String 转换成char[]
for (char c : hanyu) {
	String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(c);
	for (String string : pinyin) {
		System.out.println(">"+string);
	}
}


输出结果:

>he2
>he4
>huo2
>huo4
>huo5
>hai1
>he5
>hu2

很庆幸我用了个“和”做测试,意外发现多音字它会转换处所有发音。也解决了我当初实现这个功能的疑问----多音字怎么办?

后面数字是音调,但是如果每个字后面加数字有点不好看,我最初是直接把最后一位去掉,

然后去看了一下另一个方法中另一个不认识的参数HanyuPinyinOutputFormat,字面意思大概就是“汉语拼音输出格式”

发现里面有几个参数:

HanyuPinyinVCharType := WITH_U_AND_COLON 
HanyuPinyinCaseType := LOWERCASE 
HanyuPinyinToneType := WITH_TONE_NUMBER 

LOWERCASE
CombinationWITH_U_AND_COLONWITH_VWITH_U_UNICODE
WITH_TONE_NUMBERlu:3lv3lü3
WITHOUT_TONElu:lv
WITH_TONE_MARKthrow exceptionthrow exception
UPPERCASE
CombinationWITH_U_AND_COLONWITH_VWITH_U_UNICODE
WITH_TONE_NUMBERLU:3LV3LÜ3
WITHOUT_TONELU:LV
WITH_TONE_MARKthrow exceptionthrow exception
意外发现。

从API文档的例子中看出。

HanyuPinyinVCharType就是把v转换成ü

HanyuPinyinCaseType区分大小写

HanyuPinyinToneType声调的类型

然后都分别有那些类型也说的很清楚。然后又使用了这个方法。

String nameString = "和";
char[] hanyu= nameString.trim().toCharArray();
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (char c : hanyu) {
	String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(c, outputFormat);
	for (String string : pinyin) {
		System.out.println(">"+string);
	}
}
输出结果:

>he
>he
>huo
>huo
>huo
>hai
>he
>hu

基本达到要求,这么多音调我也用不着最后决定使用第一个(有更好的解决方案,请写到评论里,在这里先谢谢)

然后又加了些字符串的处理把首字母大写

private String toPinyin(String string){
	char[] hanyu= string.trim().toCharArray();
	HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
	//使用小写
	outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
	//去掉音调
	outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
	StringBuffer fullPinyin = new StringBuffer("");
	try {
		for (char c : hanyu) {
			String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(c, outputFormat);
			//没有拼音的原样输出如:英文、数字、符号等
			if(pinyin == null){
				fullPinyin.append(c);
				continue;
			}
			//取每个发音第一个
			String eachWorld = pinyin[0];
			eachWorld = eachWorld.substring(0,1).toUpperCase()+eachWorld.substring(1);
			fullPinyin.append(eachWorld);
			
		}
	} catch (BadHanyuPinyinOutputFormatCombination e) {
		e.printStackTrace();
	}
	return fullPinyin.toString();
}

也许又更好的方案,欢迎评论大家一起讨论

参考文档:http://pinyin4j.sourceforge.net/pinyin4j-doc/

Zemo手打,转载请标明出处:http://blog.csdn.net/zemochen/article/details/21892609




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值