由于项目需求,要求用户输入中文姓名自动转换成拼音,找到了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 | lü |
WITH_TONE_MARK | throw exception | throw exception | lǚ |
UPPERCASE | |||
---|---|---|---|
Combination | WITH_U_AND_COLON | WITH_V | WITH_U_UNICODE |
WITH_TONE_NUMBER | LU:3 | LV3 | Lü3 |
WITHOUT_TONE | LU: | LV | Lü |
WITH_TONE_MARK | throw exception | throw exception | Lǚ |
从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
原文:http://blog.csdn.net/zemochen/article/details/21892609