碰到个需求,需要按用户名字的首字母来排序。这就需要获取汉字对应的拼音了,突然就想起了pinyin4j这个jar包,于是就开始写了个汉字转拼音的工具类。在此记录一下,方便后续查阅
一、Pom依赖
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>6
1
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->2
<dependency>3
<groupId>com.belerweb</groupId> 4
<artifactId>pinyin4j</artifactId>5
<version>2.5.0</version>6
</dependency>二、代码
这个工具类,实现了获取汉字拼音和获取汉字首字母这2个方法
package com.zxy.timecard.utils;
import net.sourceforge.pinyin4j.PinyinHelper;
/**
* 拼音工具类
* @author ZENG.XIAO.YAN
* @date 2018年5月9日
*
*/
public class PinYinUtils {
/**
* 获取汉字首字母的方法。如: 张三 --> ZS
* 说明:暂时解决不了多音字的问题,只能使用取多音字的第一个音的方案
* @param hanzi 汉子字符串
* @return 大写汉子首字母; 如果都转换失败,那么返回null
*/
public static String getHanziInitials(String hanzi) {
String result = null;
if(null != hanzi && !"".equals(hanzi)) {
char[] charArray = hanzi.toCharArray();
StringBuffer sb = new StringBuffer();
for (char ch : charArray) {
// 逐个汉字进行转换, 每个汉字返回值为一个String数组(因为有多音字)
String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
if(null != stringArray) {
sb.append(stringArray[0].charAt(0));
}
}
if(sb.length() > 0) {
result = sb.toString().toUpperCase();
}
}
return result;
}
/**
* 获取汉字拼音的方法。如: 张三 --> zhangsan
* 说明:暂时解决不了多音字的问题,只能使用取多音字的第一个音的方案
* @param hanzi 汉子字符串
* @return 汉字拼音; 如果都转换失败,那么返回null
*/
public static String getHanziPinYin(String hanzi) {
String result = null;
if(null != hanzi && !"".equals(hanzi)) {
char[] charArray = hanzi.toCharArray();
StringBuffer sb = new StringBuffer();
for (char ch : charArray) {
// 逐个汉字进行转换, 每个汉字返回值为一个String数组(因为有多音字)
String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
if(null != stringArray) {
// 把第几声这个数字给去掉
sb.append(stringArray[0].replaceAll("\d", ""));
}
}
if(sb.length() > 0) {
result = sb.toString();
}
}
return result;
}
public static void main(String[] args) {
System.out.println(PinYinUtils.getHanziInitials("袁素芳"));
System.out.println(PinYinUtils.getHanziPinYin("袁素芳"));
}
}x
1
package com.zxy.timecard.utils;2
import net.sourceforge.pinyin4j.PinyinHelper;3
4
/**5
* 拼音工具类6
* @author ZENG.XIAO.YAN7
* @date 2018年5月9日8
* 9
*/10
public class PinYinUtils {11
12
/**13
* 获取汉字首字母的方法。如: 张三 --> ZS14
* 说明:暂时解决不了多音字的问题,只能使用取多音字的第一个音的方案15
* @param hanzi 汉子字符串16
* @return 大写汉子首字母; 如果都转换失败,那么返回null17
*/18
public static String getHanziInitials(String hanzi) {19
String result = null;20
if(null != hanzi && !"".equals(hanzi)) {21
char[] charArray = hanzi.toCharArray();22
StringBuffer sb = new StringBuffer();23
for (char ch : charArray) {24
// 逐个汉字进行转换, 每个汉字返回值为一个String数组(因为有多音字)25
String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);26
if(null != stringArray) {27
sb.append(stringArray[0].charAt(0));28
}29
}30
if(sb.length() > 0) {31
result = sb.toString().toUpperCase();32
}33
} 34
return result;35
}36
37
38
/**39
* 获取汉字拼音的方法。如: 张三 --> zhangsan 40
* 说明:暂时解决不了多音字的问题,只能使用取多音字的第一个音的方案41
* @param hanzi 汉子字符串42
* @return 汉字拼音; 如果都转换失败,那么返回null43
*/44
public static String getHanziPinYin(String hanzi) {45
String result = null;46
if(null != hanzi && !"".equals(hanzi)) {47
char[] charArray = hanzi.toCharArray();48
StringBuffer sb = new StringBuffer();49
for (char ch : charArray) {50
// 逐个汉字进行转换, 每个汉字返回值为一个String数组(因为有多音字)51
String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);52
if(null != stringArray) {53
// 把第几声这个数字给去掉54
sb.append(stringArray[0].replaceAll("\d", ""));55
}56
}57
if(sb.length() > 0) {58
result = sb.toString();59
}60
} 61
return result;62
}63
64
public static void main(String[] args) {65
System.out.println(PinYinUtils.getHanziInitials("袁素芳"));66
System.out.println(PinYinUtils.getHanziPinYin("袁素芳"));67
}68
}三、小结
pinyin4j这个jar里面的把功能都封装好了,只需要直接调用就ok;所以工具类写起来比较简单。
存在的问题: 多音字没处理好,只取了该字的第一个读音