关于汉字转拼音的Pinyin4j工具使用 1 Pinyin4

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

关于汉字转为拼音的相关实现,通常使用Pinyin4j框架,整理一下Pinyin4j的使用

官方文档:

pinyin4j.sourceforge.net/

1 Pinyin4j的简介

Pinyin4j 是一个流行的Java开源类库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。

支持功能:

  • 支持简体中文和繁体中文字符
  • 支持转换到汉语拼音,通用拼音
  • 支持多音字,即可以获取一个中文字符的多种发音
  • 支持多种字符串输出格式

应用场景:

  • 用户输入汉字转拼音
  • 数据库中添加姓名的首字母存储

源代码分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
java复制代码/* 主要使用中类是: net.sourceforge.pinyin4j.PinyinHelper和net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat

PinyinHelper对象处理汉语转拼音
HanyuPinyinOutputFormat对象用于处理汉语拼音输出格式

PinyinHelper对象相关方法
toHanyuPinyinStringArray(char ch)
toHanyuPinyinStringArray(char ch, HanyuPinyinOutputFormat outputFormat)

HanyuPinyinOutputFormat对象
setCaseType()方法 设置拼音大小写
HanyuPinyinCaseType.UPPERCASE:大写
HanyuPinyinCaseType.LOWERCASE:小写

setVCharType()方法 设置字符V的显示方式
HanyuPinyinVCharType.WITH_U_AND_COLON:显示为u:(默认)
HanyuPinyinVCharType.WITH_V :显示为v
HanyuPinyinVCharType.WITH_U_UNICODE:显示为ü

setToneType()方法
HanyuPinyinToneType.WITH_TONE_NUMBER:设置数字声调(默认)
HanyuPinyinToneType.WITHOUT_TONE:设置不显示声调
HanyuPinyinToneType.WITH_TONE_MARK:设置显示声调,前提必须设置V如何显示
*/

2 Pinyin4j的使用

1 添加maven依赖

1
2
3
4
5
xml复制代码    <dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>

2 添加汉字转拼音工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
java复制代码@Slf4j
public class PinYinUtils {


public static void main(String[] args) {
PinYinUtils pinYinUtils = new PinYinUtils();
String str = "唐代诗人李白-libai";
System.out.println(pinYinUtils.toHanyuPinyin(str));
System.out.println(pinYinUtils.getFirstLetter(str));
}

/**
* 汉字转拼音
*/
public String toHanyuPinyin(String hanzi) {
char[] chars = hanzi.trim().toCharArray();
String hanyupinyin = "";

//输出格式设置
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
/**
* 输出大小写设置
*
* LOWERCASE:输出小写
* UPPERCASE:输出大写
*/
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

/**
* 输出音标设置
*
* WITH_TONE_MARK:直接用音标符(必须设置WITH_U_UNICODE,否则会抛出异常)
* WITH_TONE_NUMBER:1-4数字表示音标
* WITHOUT_TONE:没有音标
*/
// defaultFormat.setToneType(HanyuPinyinToneType.WITH_TONE_MARK); // 必须设置WITH_U_UNICODE,否则会抛出异常
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

/**
* 特殊音标ü设置
*
* WITH_V:用v表示ü
* WITH_U_AND_COLON:用"u:"表示ü
* WITH_U_UNICODE:直接用ü
*/
// defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);

// 中文的正则表达式
String hanziRegex = "[\\u4E00-\\u9FA5]+";

try {
for (int i = 0; i < chars.length; i++) {
// 判断为中文,则转换为汉语拼音
if (String.valueOf(chars[i]).matches(hanziRegex)) {
hanyupinyin += PinyinHelper
.toHanyuPinyinStringArray(chars[i], defaultFormat)[0];
} else {
// 不为中文,则不转换
hanyupinyin += chars[i];
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
log.error("字符不能转成汉语拼音");
}

return hanyupinyin;
}
/**
* 取汉字的第一个字符
*/
public String getFirstLetter(String hanzi) {
char[] chars = hanzi.trim().toCharArray();
StringBuilder firstPinyin = new StringBuilder();

HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
// 拼音大写
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
// 不带声调
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

try {
String str = String.valueOf(chars[0]);
// 中文的正则表达式
String hanziRegex = "[\\u4E00-\\u9FA5]+";
// 数字表达式
String numberRegex = "[0-9]+";
// 字母表达式
String charRegex = "[a-zA-Z]+";

for (int i = 0, len = chars.length; i < len; i++) {
// 判断为汉字,则转为拼音,并取第一个字母
if (Character.toString(chars[i]).matches("[\\u4E00-\\u9FA5]+")) {
// 如果是多音字,只取第一个
String[] pys = PinyinHelper.toHanyuPinyinStringArray(chars[i], defaultFormat);
firstPinyin.append(pys[0].charAt(0));
} else {
firstPinyin.append(chars[i]);
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
log.error("字符不能转为汉语拼音");
}

return firstPinyin.toString();
}
}

/*
结果:
tangdaishirenlibai-libai
TDSRLB-libai

*/

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%