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

来源:互联网 发布:虚拟股华为知乎 编辑:程序博客网 时间:2024/04/28 09:58

由于项目需求,要求用户输入中文姓名自动转换成拼音,找到了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 

LOWERCASECombinationWITH_U_AND_COLONWITH_VWITH_U_UNICODEWITH_TONE_NUMBERlu:3lv3lü3WITHOUT_TONElu:lvlüWITH_TONE_MARKthrow exceptionthrow exceptionlǚUPPERCASECombinationWITH_U_AND_COLONWITH_VWITH_U_UNICODEWITH_TONE_NUMBERLU:3LV3LÜ3WITHOUT_TONELU:LVLÜWITH_TONE_MARKthrow exceptionthrow exceptionLǙ意外发现。

从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 0
原创粉丝点击