pinyin4j的主页:http://pinyin4j.sourceforge.net/
pinyin4j是一个支持将中文转换到拼音的Java开源类库。
pinyi4j的基本用法:
1. 简单介绍
有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,通常都是用拼音进行查询的。比如要查询“曹孟德”,就可以输入“cmd”,即“曹孟德”三个汉字的拼音“caomengde”各字的首字母。但是怎样才能将“曹孟德”翻译成“caomengde”呢?很简单的办法就是建立一个大的对照表(比如用关联容器Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但这样的做法,需要维护好一个比较大的对照表,同时一个汉字可能有多个发音,也就是说Map这样的容器时不行的,因为其<key,value>必须是一一对应的。在C++中可以用STL里面的multimap来解决这个问题,但Java中没有类似multimap这样的东西,除非自己实现一个。
Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大:
+ 支持同一汉字有多个发音
+ 还支持拼音的格式化输出,比如第几声之类的,
+ 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。下面是其官方网址,其中提供了下载:
http://pinyin4j.sourceforge.net/
2. 基本用法:
通常情况下,只需要用到其中的PinyinHelper类中的静态方法toHanyuPinyinStringArray就可以了,比如:
1
2
3
4
|
String[] pinyinArray =PinyinHelper.toHanyuPinyinStringArray(
'单'
);
for
(
int
i =
0
; i < pinyinArray.length; ++i){
System.out.println(pinyinArray[i]);
}
|
就会输出:
1
2
3
|
dan1
chan2
shan4
|
这三种发音,后面的数字代表第几声。可以看到静态方法toHanyuPinyinStringArray返回的数据类型是一个String数组,它用来接收一个汉字的多个发音,如果toHanyuPinyinStringArray中的参数不是汉字,那么它会返回null。
3. 格式支持
Pinyin4j支持拼音输出的格式化,比如,“黄”可以输出为“huang”、“huang2”、“huáng”等等,下面的代码就似是输出“huáng”的示例:
1
2
3
4
5
6
7
8
9
10
11
12
|
HanyuPinyinOutputFormat format=
new
HanyuPinyinOutputFormat();
format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
String[] pinyinArray =
null
;
try
{
pinyinArray = PinyinHelper.toHanyuPinyinStringArray(
'黄'
, format);
}
catch
(BadHanyuPinyinOutputFormatCombination e){
e.printStackTrace();
}
for
(
int
i =
0
; i < pinyinArray.length; ++i){
System.out.println(pinyinArray[i]);
}
|
此外,还支持大小写转换、ü等等。详细情况,可以查看Pinyin4j自带的文档。
4. 实际示例代码
如果我们要将一段文字中的汉字全部转换成不带音调的拼音输出,而这段文字中又可能包含阿拉伯数字、英文、标点符号等等。如果完全靠自己写代码进行转换,那是非常麻烦的,其中一个首先就要区别,这段文字中那些是汉字,那些是非汉字。有了Pinyin4j,这个问题就不再困难了,因为对于非汉字,Pinyin4j会自动输出null。参考下面的示例代码:
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
|
import
net.sourceforge.pinyin4j.*;
import
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import
net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import
net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public
class
Chinese2PY{
public
static
void
main(String[] args){
Hanyu hanyu =
new
Hanyu();
// 中英文混合的一段文字
String str =
"荆溪白石出,Hello 天寒红叶稀。Android 山路元无雨,What's up? 空翠湿人衣。"
;
String strPinyin = hanyu.getStringPinYin(str);
System.out.println(strPinyin);
}
}
class
Hanyu{
private
HanyuPinyinOutputFormat format =
null
;
private
String[] pinyin;
public
Hanyu(){
format =
new
HanyuPinyinOutputFormat();
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
pinyin =
null
;
}
//转换单个字符
public
String getCharacterPinYin(
char
c){
try
{
pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);
}
catch
(BadHanyuPinyinOutputFormatCombination e){
e.printStackTrace();
}
// 如果c不是汉字,toHanyuPinyinStringArray会返回null
if
(pinyin ==
null
)
return
null
;
// 只取一个发音,如果是多音字,仅取第一个发音
return
pinyin[
0
];
}
//转换一个字符串
public
String getStringPinYin(String str){
StringBuilder sb =
new
StringBuilder();
String tempPinyin =
null
;
for
(
int
i =
0
; i < str.length(); ++i){
tempPinyin =getCharacterPinYin(str.charAt(i));
if
(tempPinyin ==
null
){
// 如果str.charAt(i)非汉字,则保持原样
sb.append(str.charAt(i));
}
else
{
sb.append(tempPinyin);
}
}
return
sb.toString();
}
}
|
输出结果:
1
|
jingxibaishichu,Hellotianhanhongyexi。Android shanluyuanwuyu,What'sup? kongcuishirenyi
|
以上基本用法内容来自:http://blog.csdn.net/pathuang68/article/details/6692882
下面是一个项目中用到的工具类:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
package
cn.heimar.common.util;
import
java.util.HashSet;
import
java.util.Set;
import
net.sourceforge.pinyin4j.PinyinHelper;
import
net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import
net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import
net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import
net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public
class
Pinyin4jUtil {
/**
* 返回拼音类型:全拼
*/
public
static
final
String RET_PINYIN_TYPE_FULL =
"full"
;
/**
* 返回拼音类型:首字母
*/
public
static
final
String RET_PINYIN_TYPE_HEADCHAR =
"headChar"
;
/**
* 字符串集合转换字符串(逗号分隔)
*
* @param stringSet
* @return
*/
public
static
String makeStringByStringSet(Set<String> stringSet) {
StringBuilder str =
new
StringBuilder();
int
i =
0
;
for
(String s : stringSet) {
if
(i == stringSet.size() -
1
) {
str.append(s);
}
else
{
str.append(s +
","
);
}
i++;
}
return
str.toString().toLowerCase();
}
public
static
Set<String> str2Pinyin(String src) {
return
str2Pinyin(src,
null
);
}
/**
* 字符串转换为拼音
* @param src 需要转换的字符串
* @param retType 返回拼音结果类型
* @return 如果retType为RET_PINYIN_TYPE_FULL,则返回全拼;如果retType为RET_PINYIN_TYPE_HEADCHAR;如果传入其他值,返回全拼
* @throws BadHanyuPinyinOutputFormatCombination
*/
public
static
Set<String> str2Pinyin(String src, String retType) {
if
(src !=
null
&& !src.trim().equalsIgnoreCase(
""
)) {
char
[] srcChar;
srcChar = src.toCharArray();
// 汉语拼音格式输出类
HanyuPinyinOutputFormat hanYuPinOutputFormat =
new
HanyuPinyinOutputFormat();
// 输出设置,大小写,音标方式等
hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
String[][] temp =
new
String[src.length()][];
for
(
int
i =
0
; i < srcChar.length; i++) {
char
c = srcChar[i];
try
{
temp[i] = PinyinHelper.toHanyuPinyinStringArray(
srcChar[i], hanYuPinOutputFormat);
if
(temp[i] ==
null
){
//如果str.charAt(i)非汉字,则保持原样
temp[i] =
new
String[] { String.valueOf(srcChar[i]) };
}
else
{
//如果retType是RET_PINYIN_TYPE_HEADCHAR,则只取转换后的首字母
if
(RET_PINYIN_TYPE_HEADCHAR.equalsIgnoreCase(retType)){
String[] temptemp =
new
String[temp[i].length];
for
(
int
j =
0
; j < temp[i].length; j++){
temptemp[j] =String.valueOf(temp[i][j].charAt(
0
));
}
temp[i] = temptemp;
}
}
}
catch
(BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}
String[] pingyinArray = Exchange(temp);
Set<String> pinyinSet =
new
HashSet<String>();
for
(
int
i =
0
; i < pingyinArray.length; i++) {
pinyinSet.add(pingyinArray[i]);
}
return
pinyinSet;
}
return
null
;
}
/**
* 递归
*
* @param strJaggedArray
* @return
*/
public
static
String[] Exchange(String[][] strJaggedArray) {
String[][] temp = DoExchange(strJaggedArray);
return
temp[
0
];
}
/**
* 递归
*
* @param strJaggedArray
* @return
*/
private
static
String[][] DoExchange(String[][] strJaggedArray) {
int
len = strJaggedArray.length;
if
(len >=
2
) {
int
len1 = strJaggedArray[
0
].length;
int
len2 = strJaggedArray[
1
].length;
int
newlen = len1 * len2;
String[] temp =
new
String[newlen];
int
Index =
0
;
for
(
int
i =
0
; i < len1; i++) {
for
(
int
j =
0
; j < len2; j++) {
temp[Index] = strJaggedArray[
0
][i] + strJaggedArray[
1
][j];
Index++;
}
}
String[][] newArray =
new
String[len -
1
][];
for
(
int
i =
2
; i < len; i++) {
newArray[i -
1
] = strJaggedArray[i];
}
newArray[
0
] = temp;
return
DoExchange(newArray);
}
else
{
return
strJaggedArray;
}
}
public
static
void
main(String[] args) {
String str =
"单单芳abc"
;
System.out.println(makeStringByStringSet(str2Pinyin(str)));
System.out.println(makeStringByStringSet(str2Pinyin(str, RET_PINYIN_TYPE_HEADCHAR)));
}
}
|
输出结果:
1
2
|
danshanfangabc,dandanfangabc,danchanfangabc,shanshanfangabc,chandanfangabc,shandanfangabc,chanchanfangabc,shanchanfangabc,chanshanfangabc
dsfabc,ssfabc,cdfabc,ddfabc,csfabc,ccfabc,dcfabc,scfabc,sdfabc
|