现在的位置: 首页 > 综合 > 正文

pinyin4j 汉字转换为拼音 (支持多音字)

2013年07月07日 ⁄ 综合 ⁄ 共 4221字 ⁄ 字号 评论关闭

使用pinyin4j将汉字转换成拼音需要下载pinyin4j的jar包,这里使用的是pinyin4j-2.5.0.jar;下载地址:http://sourceforge.net/projects/pinyin4j/files/latest/download?source=files

历史各个版本下载地址:http://sourceforge.net/projects/pinyin4j/files/

package com.companyname.system.module.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;

/************************************************
 * 
 * @Description pinyin4j支持:</P>
 * 声调格式化。例如:“刘”字的格式化后为“liu2”或“liu”或“liú” </P>
 * 对特殊拼音ü的的显示格式。例如“u:”或“v”或“ü” </P>
 * 大小写的转换。例如:“liu2”或“LIU2”
 * 
 * @author Rosanu
 * @date 2012-10-10 20:10:00
 * @version V1.0 
 *************************************************/
public class PinYinUtil {
	public static void main(String[] args) {
		System.out.println("输出结果:");
		//字符是单引号,字符串是双引号
		System.out.println(chineseCharToPinYin('拼', false, ""));
		//多音字
		System.out.println(chineseCharToPinYin('乐', true, " "));
		//中文字符串转换成拼音
		System.out.println(ChineseStringToPinYin("中文字符串转换成拼音", ""));
		//有空格
		System.out.println(ChineseStringToPinYin("中文字符串转换成拼音", " "));
	}
	/**
	 * 单个字符转换成拼音
	 *  
	 * @param chinese 中文字符
	 * @param isPolyphone 多音字
	 * @param separator 分隔符(String separator = "line.separator"; //Line separator ("\n" on UNIX) 换行)
	 * 
	 */
	private static String chineseCharToPinYin(char chinese, boolean isPolyphone, String separator) {
        StringBuffer pinyin = new StringBuffer();
        
        // 如果是中文  
        if (chinese > 128) {
        	//创建格式化对象
    		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
    		//设置声调格式
    		outputFormat.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
    		/**
    		 * 方法参数HanyuPinyinToneType有以下常量对象:
    		 * HanyuPinyinToneType.WITH_TONE_NUMBER 用数字表示声调,例如:liu2
    		 * HanyuPinyinToneType.WITHOUT_TONE 无声调表示,例如:liu
    		 * HanyuPinyinToneType.WITH_TONE_MARK 用声调符号表示,例如:liú
    		 * 
    		 * */
    		
    		//设置特殊拼音ü的显示格式
    		outputFormat.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
    		
    		/**
    		 * 方法参数HanyuPinyinVCharType有以下常量对象:
    		 * HanyuPinyinVCharType.WITH_U_AND_COLON 以U和一个冒号表示该拼音,例如:lu:
    		 * HanyuPinyinVCharType.WITH_V 以V表示该字符,例如:lv
    		 * HanyuPinyinVCharType.WITH_U_UNICODE 以ü表示
    		 * 
    		 * */
    		
    		//设置大小写格式
    		outputFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
    		/**
    		 * HanyuPinyinCaseType.LOWERCASE 转换后以全小写方式输出
    		 * HanyuPinyinCaseType.UPPERCASE 转换后以全大写方式输出
    		 * 
    		 * */
    		try {
    			//返回的数组即是该字符的拼音,如上例就是pinYin[0]=liu2,后面的数字代表声调,
    			//声调为5表示轻读,无声调。之所谓返回数组,是因为被判定的汉字有可能有多个读音。
    			//如果输入的参数不是汉字,则返回null。
    			String[] pinYinArray = PinyinHelper.toHanyuPinyinStringArray(chinese, outputFormat);
    			
    			//System.out.println(concatPinYinStringArray(pinYinArray));
    			
    			if (pinYinArray == null || pinYinArray.length < 1) {
					return "";
				}
                //是否区分多音字,默认只查出多音字的第一个拼音
                if (isPolyphone && separator != null) {
                	for (int i = 0; i < pinYinArray.length; i++) {
                		pinyin.append(pinYinArray[i]);
                		//不是数组最后一个(拼音的时候)
                        if (pinYinArray.length != (i + 1)) {  
                            //多音字的拼音之间使用分割符号分割开来  
                        	pinyin.append(separator);  
                        }  
    				}
                } else {
					pinyin.append(pinYinArray[0]);
				}
    		} catch (BadHanyuPinyinOutputFormatCombination e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        } else {
        	pinyin.append(chinese);
		}
        
        return pinyin.toString();
	}

	/**
	 * 将拼音数组转换成拼音字符串
	 *  
	 * @param pinYinArray 拼音数组(含一个或多个拼音)
	 * 
	 */
	private static String concatPinYinStringArray(String[] pinYinArray)
    {
        StringBuffer pinYinStrBuf = new StringBuffer();
        if ((null != pinYinArray) && (pinYinArray.length > 0))
        {
            for (int i = 0; i < pinYinArray.length; i++)
            {
            	pinYinStrBuf.append(pinYinArray[i]);
                //line.separator Line separator ("\n" on UNIX) 换行
            	pinYinStrBuf.append(System.getProperty("line.separator"));
            }
        } else {
			return "";
		}
		System.out.println("系统属性(换行符):" + System.getProperty("line.separator"));
        String outputString = pinYinStrBuf.toString();
        return outputString;
    }
	
	/**
	 * 中文字符串转换成拼音
	 * @param chinese 中文字符串
	 * @param separator 分隔符
	 * */
	@SuppressWarnings("deprecation")
	public static String ChineseStringToPinYin(String chinese, String separator) {  
        // 创建汉语拼音处理类  
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
        // 输出设置:大小写,音标方式  
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
          
        String pinyin = "";  
        try {  
        	pinyin = PinyinHelper.toHanyuPinyinString(chinese, defaultFormat, separator);  
        } catch (BadHanyuPinyinOutputFormatCombination e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }     
        return pinyin;  
	}
}

输出结果:
PĪN
LÈ YUÈ
zhongwenzifuchuanzhuanhuanchengpinyin
zhong wen zi fu chuan zhuan huan cheng pin yin

作者声明:本人Rosanu对以上所有任何内容享有版权,转载请注明作者本人Rosanu及出处。向你的厚道致敬。谢谢。

抱歉!评论已关闭.