首页 > 其他 > 详细

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

时间:2014-03-24 13:32:19      阅读:536      评论:0      收藏:0      [点我收藏+]

由于项目需求,要求用户输入中文姓名自动转换成拼音,找到了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
Combination WITH_U_AND_COLON WITH_V WITH_U_UNICODE
WITH_TONE_NUMBER lu:3 lv3 lü3
WITHOUT_TONE lu: lv
WITH_TONE_MARK throw exception throw exception
UPPERCASE
Combination WITH_U_AND_COLON WITH_V WITH_U_UNICODE
WITH_TONE_NUMBER LU:3 LV3 Lü3
WITHOUT_TONE LU: LV
WITH_TONE_MARK throw exception throw 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




J2EE 使用pinyin4j实现汉字转换拼音,布布扣,bubuko.com

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

原文:http://blog.csdn.net/zemochen/article/details/21892609

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!