今天在做项目时,遇到了将客户添加的商品的名称转换成拼音码的需求,虽然公司有现成的拼音码数据库表,但发现不够全,而且使用的时候为了得到一个字符串的拼音码要频繁的查询数据库。所以想用其它的办法来完成需求,后来 Google 了一番,虽然找到一些别人写的工具类,但发现要么无法支持UTF-8编码的汉字的转换,要么就是遇到字符串中包含非汉字时就会出错,后来找到了一篇 blog,但发现与我的需求还有一些偏差,于是自己又在上面的基础上进行了修改,现附上源码,希望可以帮到哪些遇到和我一样需求的朋友们。(需要pinyin4j.jar支持,没找到添加附件的功能,需要的话,可以去下面这个地址下载)
本文参考了另一篇 blog :http://my.oschina.net/tiancai/blog/93751
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.exception.BadHanyuPinyinOutputFormatCombination;
/**
* java汉字转拼音操作工具类,如包含非汉字则不对其转换,直接跳过
*/
public class PinYinMaUtil {
/**
* 将字符串转换成拼音数组
* @param str 待转换的汉字字符串
* @param onlyFirst 是否只取每个汉字对应的拼音的首字母
* @return 转换成拼音码的字符串
*/
public static String stringToPinyin(String str,boolean onlyFirst) {
return stringToPinyin(str,onlyFirst, false, null);
}
/**
* 将字符串转换成拼音数组
* @param str 待转换的汉字字符串
* @param onlyFirst 是否只取每个汉字对应的拼音的首字母
* @return 转换成拼音码的字符串
*/
public static String stringToPinyin(String str,boolean onlyFirst,String separator) {
return stringToPinyin(str,onlyFirst, true, separator);
}
/**
* 将字符串转换成拼音数组
* @param str 待转换的汉字字符串
* @param isPolyphone 是否查出多音字的所有拼音
* @param separator 多音字拼音之间的分隔符
* @return
*/
public static String stringToPinyin(String str,boolean onlyFirst, boolean isPolyphone,
String separator) {
// 判断字符串是否为空
if ("".equals(str) || null == str) {
return null;
}
char[] strChar = str.toCharArray();
int strCount = strChar.length;
StringBuffer sb = new StringBuffer();
String temp = null;
for (int i = 0; i < strCount; i++) {
temp = charToPinyin(strChar[i], isPolyphone, separator);
if(onlyFirst){
sb.append( temp.substring(0, 1));
}else{
sb.append(temp);
}
}
return sb.toString();
}
/**
* 将单个字符转换成拼音
* @param str 待转换的汉字字符串
* @return 转换成拼音码后的字符串
*/
public static String charToPinyin(char str, boolean isPolyphone,
String separator) {
// 创建汉语拼音处理类
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
// 输出设置,大小写,音标方式
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
StringBuffer tempPinying = new StringBuffer();
// 如果是中文
if (str > 128) {
try {
// 转换得出结果
String[] strs = PinyinHelper.toHanyuPinyinStringArray(str,
defaultFormat);
// 是否查出多音字,默认是查出多音字的第一个字符
if (isPolyphone && null != separator) {
for (int i = 0; i < strs.length; i++) {
tempPinying.append(strs[i]);
if (strs.length != (i + 1)) {
// 多音字之间用特殊符号间隔起来
tempPinying.append(separator);
}
}
} else {
tempPinying.append(strs[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
tempPinying.append(str);
}
return tempPinying.toString();
}
public static String hanziToPinyin(String hanzi){
return hanziToPinyin(hanzi," ");
}
/**
* 将汉字转换成拼音
* @param hanzi
* @param separator
* @return
*/
@SuppressWarnings("deprecation")
public static String hanziToPinyin(String hanzi,String separator){
// 创建汉语拼音处理类
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
// 输出设置,大小写,音标方式
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
// defaultFormat.setVCharType(HanyuPinyingVCharType);
String pinyingStr="";
try {
pinyingStr=PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return pinyingStr;
}
/**
* 将字符串数组转换成字符串
* @param str
* @param separator 各个字符串之间的分隔符
* @return
*/
public static String stringArrayToString(String[] str, String separator) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length; i++) {
sb.append(str[i]);
if (str.length != (i + 1)) {
sb.append(separator);
}
}
return sb.toString();
}
/**
* 简单的将各个字符数组之间连接起来
* @param str
* @return
*/
public static String stringArrayToString(String[] str){
return stringArrayToString(str,"");
}
/**
* 将字符数组转换成字符串
* @param str
* @param separator 各个字符串之间的分隔符
* @return
*/
public static String charArrayToString(char[] ch, String separator) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ch.length; i++) {
sb.append(ch[i]);
if (ch.length != (i + 1)) {
sb.append(separator);
}
}
return sb.toString();
}
/**
* 将字符数组转换成字符串
* @param str
* @return
*/
public static String charArrayToString(char[] ch) {
return charArrayToString(ch," ");
}
/**
* 取汉字的首字母
* @param str
* @param isCapital 是否是大写
* @return
*/
public static char[] getHeadByChar(char str,boolean isCapital){
//如果不是汉字直接返回
if (str <= 128) {
return new char[]{str};
}
//获取所有的拼音
String []pinyingStr=PinyinHelper.toHanyuPinyinStringArray(str);
//创建返回对象
int polyphoneSize=pinyingStr.length;
char [] headChars=new char[polyphoneSize];
int i=0;
//截取首字符
for(String s:pinyingStr){
char headChar=s.charAt(0);
//首字母是否大写,默认是小写
if(isCapital){
headChars[i]=Character.toUpperCase(headChar);
}else{
headChars[i]=headChar;
}
i++;
}
return headChars;
}
/**
* 取汉字的首字母(默认是大写)
* @param str
* @return
*/
public static char[] getHeadByChar(char str){
return getHeadByChar(str,true);
}
/**
* 查找字符串首字母
* @param str
* @return
*/
public static String[] getHeadByString(String str){
return getHeadByString( str, true);
}
/**
* 查找字符串首字母
* @param str
* @param isCapital 是否大写
* @return
*/
public static String[] getHeadByString(String str,boolean isCapital){
return getHeadByString( str, isCapital,null);
}
/**
* 查找字符串首字母
* @param str
* @param isCapital 是否大写
* @param separator 分隔符
* @return
*/
public static String[] getHeadByString(String str,boolean isCapital,String separator){
char[]chars=str.toCharArray();
String[] headString=new String[chars.length];
int i=0;
for(char ch:chars){
char[]chs=getHeadByChar(ch,isCapital);
StringBuffer sb=new StringBuffer();
if(null!=separator){
int j=1;
for(char ch1:chs){
sb.append(ch1);
if(j!=chs.length){
sb.append(separator);
}
j++;
}
}else{
sb.append(chs[0]);
}
headString[i]=sb.toString();
i++;
}
return headString;
}
public static void main(String[] args) {
System.out.println(hanziToPinyin("是都就写",""));
String pym =stringToPinyin("的8说法'()[]是",false);
System.out.println(pym);
}
}