使用pinyin4j

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值