碰到個需求,需要按用戶名字的首字母來排序。這就需要獲取漢字對應的拼音了,突然就想起了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;所以工具類寫起來比較簡單。
存在的問題: 多音字沒處理好,只取了該字的第一個讀音