碰到个需求,需要按用户名字的首字母来排序。这就需要获取汉字对应的拼音了,突然就想起了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.YAN
7
* @date 2018年5月9日
8
*
9
*/
10
public class PinYinUtils {
11
12
/**
13
* 获取汉字首字母的方法。如: 张三 --> ZS
14
* 说明:暂时解决不了多音字的问题,只能使用取多音字的第一个音的方案
15
* @param hanzi 汉子字符串
16
* @return 大写汉子首字母; 如果都转换失败,那么返回null
17
*/
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 汉字拼音; 如果都转换失败,那么返回null
43
*/
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;所以工具类写起来比较简单。
存在的问题: 多音字没处理好,只取了该字的第一个读音
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15519.html