前言
在网上百度一下可以找到很多的实现,不过我这里介绍一个pinyin4j-2.5.0.jar,这个类库可以将汉字转换为待音标的以及可以将多音字转换为拼音,具体关于它的基本用法由于网上是在是汗牛充栋了,我也就不在继续介绍了,下面给出的是我根据自己的需求自己封装的常用方法,对应jar包下载请参看下面下载链接。
Jar包下载 : 360云盘 访问密码 42b4
封装pinyin4j-2.5.0
首先贴出具体代码,如果在网上看了pinyin4j-2.5.0的用法的可以很简单看懂。
package com.jay.util;
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 HanZi2PinYin {
// 转换格式, 小写,大写,首字母大写
public static enum Type {
LOWERCASE, UPPERCASE, FITST_UPPERCASE
};
/**
* 将汉字转换为全拼,默认为首字母大写
*
* @param src
* 源字符串
*
* @return 转换后的字符串
*/
public static String getPinYin(String src) {
return getPinYin(src, Type.FITST_UPPERCASE);
}
/**
* 将汉字按照指定格式转换为拼音
*
* @param src
* 源字符串
*
* @param type
* 转换的格式
*
* @return 转换后的字符串
*/
public static String getPinYin(String src, Type type) {
char[] charArray = src.toCharArray();
String[] t2 = new String[charArray.length];
// 设置汉字拼音输出的格式
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
if (type == Type.UPPERCASE)
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
else
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
String result = "";
try {
for (int i = 0; i < charArray.length; i++) {
// 判断是否为汉字字符
if (Character.toString(charArray[i]).matches(
"[\\u4E00-\\u9FA5]+")) {
t2 = PinyinHelper.toHanyuPinyinStringArray(charArray[i],
format);// 将汉字的几种全拼都存到t2数组中
char[] tt = t2[0].toCharArray();
if (type == Type.FITST_UPPERCASE)
tt[0] -= 32;
result += String.valueOf(tt);// 取出该汉字全拼的第一种读音并连接到字符串t4后
} else {
// 如果不是汉字字符,间接取出字符并连接到字符串t4后
result += Character.toString(charArray[i]);
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return result;
}
/**
* 提取每个汉字的首字母
*
* @param str
* 带转换的字符串
*
* @return String 转换后的字符串
*/
public static String getPinYinHeadChar(String str) {
String convert = "";
for (int j = 0; j < str.length(); j++) {
char word = str.charAt(j);
// 提取汉字的首字母
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
convert += pinyinArray[0].charAt(0);
} else {
convert += word;
}
}
return convert;
}
/**
* 将字符串转换成ASCII码
*
* @param cnStr
* 待转换的字符串
*
* @return String 转换以后的字符串
*/
public static String getCnASCII(String cnStr) {
StringBuffer strBuf = new StringBuffer();
// 将字符串转换成字节序列
byte[] bGBK = cnStr.getBytes();
for (int i = 0; i < bGBK.length; i++) {
// 将每个字符转换成ASCII码
strBuf.append(Integer.toHexString(bGBK[i] & 0xff));
}
return strBuf.toString();
}
}
下面测试上面贴出的几个方法。
public class Main {
public static void main(String[] args) throws Exception {
String str = "这是(222)待转换(adbc)的字符串";
System.out.println(HanZi2PinYin.getPinYin(str));
System.out.println(HanZi2PinYin.getPinYin(str,HanZi2PinYin.Type.UPPERCASE));
System.out.println(HanZi2PinYin.getPinYinHeadChar(str));
}
}
输出如下,可以看到,正确的进行了转换,并且没有丢弃噪音(()里面的内容)
ZheiShi(222)DaiZhuanHuan(adbc)DeZiFuChuan ZHEISHI(222)DAIZHUANHUAN(adbc)DEZIFUCHUAN zs(222)dzh(adbc)dzfc