`

pinyin4j 中文转成拼音(支持多音字输出)

阅读更多

最近要做一个中文转为拼音,于是联想到 pinyin4j,网络上很多资料,可是不全,整理一下中文转成拼音(支持多音字输出)

详细代码:

 

package com.baison.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;

/*******************************************************************************
 * pinyin4j is a plug-in, you can kind of Chinese characters into phonetic.Multi-tone character,Tone
 * Detailed view http://pinyin4j.sourceforge.net/
 * 
 * @author Administrator
 * @ClassName: Pinyin4jUtil
 * @Description: TODO
 * @author wang_china@foxmail.com
 * @date Jan 13, 2012 9:28:28 AM
 */
public class Pinyin4jUtil {

	/***************************************************************************
	 * 获取中文汉字拼音 默认输出
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:54:01 AM
	 * @param chinese
	 * @return
	 */
	public static String getPinyin(String chinese) {
		return getPinyinZh_CN(makeStringByStringSet(chinese));
	}

	/***************************************************************************
	 * 拼音大写输出
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:58:45 AM
	 * @param chinese
	 * @return
	 */
	public static String getPinyinToUpperCase(String chinese) {
		return getPinyinZh_CN(makeStringByStringSet(chinese)).toUpperCase();
	}

	/***************************************************************************
	 * 拼音小写输出
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:58:45 AM
	 * @param chinese
	 * @return
	 */
	public static String getPinyinToLowerCase(String chinese) {
		return getPinyinZh_CN(makeStringByStringSet(chinese)).toLowerCase();
	}

	/***************************************************************************
	 * 首字母大写输出
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 10:00:54 AM
	 * @param chinese
	 * @return
	 */
	public static String getPinyinFirstToUpperCase(String chinese) {
		return getPinyin(chinese);
	}

	/***************************************************************************
	 * 拼音简拼输出
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 11:08:15 AM
	 * @param chinese
	 * @return
	 */
	public static String getPinyinJianPin(String chinese) {
		return getPinyinConvertJianPin(getPinyin(chinese));
	}

	/***************************************************************************
	 * 字符集转换
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:34:11 AM
	 * @param chinese
	 *            中文汉字
	 * @throws BadHanyuPinyinOutputFormatCombination
	 */
	public static Set<String> makeStringByStringSet(String chinese) {
		char[] chars = chinese.toCharArray();
		if (chinese != null && !chinese.trim().equalsIgnoreCase("")) {
			char[] srcChar = chinese.toCharArray();
			String[][] temp = new String[chinese.length()][];
			for (int i = 0; i < srcChar.length; i++) {
				char c = srcChar[i];

				// 是中文或者a-z或者A-Z转换拼音
				if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")) {

					try {
						temp[i] = PinyinHelper.toHanyuPinyinStringArray(
								chars[i], getDefaultOutputFormat());

					} catch (BadHanyuPinyinOutputFormatCombination e) {
						e.printStackTrace();
					}
				} else if (((int) c >= 65 && (int) c <= 90)
						|| ((int) c >= 97 && (int) c <= 122)) {
					temp[i] = new String[] { String.valueOf(srcChar[i]) };
				} else {
					temp[i] = new String[] { "" };
				}
			}
			String[] pingyinArray = Exchange(temp);
			Set<String> zhongWenPinYin = new HashSet<String>();
			for (int i = 0; i < pingyinArray.length; i++) {
				zhongWenPinYin.add(pingyinArray[i]);
			}
			return zhongWenPinYin;
		}
		return null;
	}

	/***************************************************************************
	 * Default Format 默认输出格式
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:35:51 AM
	 * @return
	 */
	public static HanyuPinyinOutputFormat getDefaultOutputFormat() {
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		format.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 小写
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 没有音调数字
		format.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);// u显示
		return format;
	}

	/***************************************************************************
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:39:54 AM
	 * @param strJaggedArray
	 * @return
	 */
	public static String[] Exchange(String[][] strJaggedArray) {
		String[][] temp = DoExchange(strJaggedArray);
		return temp[0];
	}

	/***************************************************************************
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:39:47 AM
	 * @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] = capitalize(strJaggedArray[0][i])
							+ capitalize(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;
		}
	}

	/***************************************************************************
	 * 首字母大写
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:36:18 AM
	 * @param s
	 * @return
	 */
	public static String capitalize(String s) {
		char ch[];
		ch = s.toCharArray();
		if (ch[0] >= 'a' && ch[0] <= 'z') {
			ch[0] = (char) (ch[0] - 32);
		}
		String newString = new String(ch);
		return newString;
	}

	/***************************************************************************
	 * 字符串集合转换字符串(逗号分隔)
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:37:57 AM
	 * @param stringSet
	 * @return
	 */
	public static String getPinyinZh_CN(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();
	}

	/***************************************************************************
	 * 获取每个拼音的简称
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 11:05:58 AM
	 * @param chinese
	 * @return
	 */
	public static String getPinyinConvertJianPin(String chinese) {
		String[] strArray = chinese.split(",");
		String strChar = "";
		for (String str : strArray) {
			char arr[] = str.toCharArray(); // 将字符串转化成char型数组
			for (int i = 0; i < arr.length; i++) {
				if (arr[i] >= 65 && arr[i] < 91) { // 判断是否是大写字母
					strChar += new String(arr[i] + "");
				}
			}
			strChar += ",";
		}
		return strChar;
	}

	/***************************************************************************
	 * Test
	 * 
	 * @Name: Pinyin4jUtil.java
	 * @Description: TODO
	 * @author: wang_chian@foxmail.com
	 * @version: Jan 13, 2012 9:49:27 AM
	 * @param args
	 */
	public static void main(String[] args) {
		String str = "张三";
		System.out.println("小写输出:" + getPinyinToLowerCase(str));
		System.out.println("大写输出:" + getPinyinToUpperCase(str));
		System.out.println("首字母大写输出:" + getPinyinFirstToUpperCase(str));
		System.out.println("简拼输出:" + getPinyinJianPin(str));

	}
}
分享到:
评论
3 楼 fengwuqing40 2014-01-22  
zxh277100963 写道
有个bug String输入数字 报错
修改一下
   
 public static String capitalize(String s) {   
        char ch[];   
        ch = s.toCharArray();
     [color=red] if (ch!= null && ch.length > 0) { //修改[/color]
        if (ch[0] >= 'a' && ch[0] <= 'z') {   
            ch[0] = (char) (ch[0] - 32);   
        } 
      }
        String newString = new String(ch);   
        return newString;   
    }  
 


但是输出还是没数字
修改一下这

     else {   
                    temp[i] = new String[] { String.valueOf(srcChar[i]) };   
                }  


<b>如果需要输出数字,可修改getPinyinConvertJianPin方法中的if条件:<br/>
if (arr[i] >= 65 && arr[i] < 91 ||
(arr[i]>=48 && arr[i]<=57)) { // 判断是否是大写字母
strChar += new String(arr[i] + "");
}</b>
2 楼 pimkle 2013-05-30  
楼主说的很好 评论补充的也好 像是解决了多音字的问题 可是还需要用户自己来选择........
1 楼 zxh277100963 2012-08-09  
有个bug String输入数字 报错
修改一下
   
 public static String capitalize(String s) {   
        char ch[];   
        ch = s.toCharArray();
     [color=red] if (ch!= null && ch.length > 0) { //修改[/color]
        if (ch[0] >= 'a' && ch[0] <= 'z') {   
            ch[0] = (char) (ch[0] - 32);   
        } 
      }
        String newString = new String(ch);   
        return newString;   
    }  
 


但是输出还是没数字
修改一下这

     else {   
                    temp[i] = new String[] { String.valueOf(srcChar[i]) };   
                }  

相关推荐

    利用Java开源库把汉字转拼音

    pinyin4j能够根据中文字符获取其对应的拼音,...支持多音字,即可以获取一个中文字符的多种发音; 支持多种字符串输出格式,比如支持Unicode格式的字符ü和声调符号(阴平 "ˉ",阳平"ˊ",上声"ˇ",去声"ˋ")的输出。

    一个汉字转拼音的Java开源类库-JPinyin

    JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。 【JPinyin主要特性】 1、准确、完善的字库; Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体...

    jpinyin-1.1.8-javadoc.jar

    JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。主要特性: 1、准确、完善的字库; Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体字(异体字不...

    jpinyin-jdk1.6.jar

    JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。 【JPinyin主要特性】 1、准确、完善的字库; Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体字...

    java开源包4

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包1

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包11

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包2

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包3

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包6

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包5

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包10

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包8

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包7

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包9

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    java开源包101

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    Java资源包01

    中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 ...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

    摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出...

Global site tag (gtag.js) - Google Analytics