JAVA实现汉字转换为拼音 pinyin4j/JPinyin

Java
197
0
0
2023-11-13

在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,比如说通讯录,就会要求按名字首字符发音排序,如果自己写实现这方面的功能是个很好大的工程,还好网上有公开的第三方jar支持转换,结合网上很多前辈的代码,copy了两个简单的工具方法,供参考

第一个是使用pinyin4j的jar,此jar对多音字语句的处理不太理想

 package com.lovo.utils;

import org.springframework.stereotype.Component;

import net.sourceforge.pinyinj.PinyinHelper;
import net.sourceforge.pinyinj.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyinj.format.HanyuPinyinToneType;
import net.sourceforge.pinyinj.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * pinyinj汉字转拼音工具类
 * @author zhiheng
 *
 */
@Component
public class ChangeToPinYin {

    //pinyinj格式类
    private HanyuPinyinOutputFormat format = null;
    //拼音字符串数组
    private String[]pinyin;
    
    //通过构造方法进行初始化
    public ChangeToPinYin(){
        
        format = new HanyuPinyinOutputFormat();
        /*
         * 设置需要转换的拼音格式
         * 以天为例
         * HanyuPinyinToneType.WITHOUT_TONE 转换为tian
         * HanyuPinyinToneType.WITH_TONE_MARK 转换为tian
         * HanyuPinyinVCharType.WITH_U_UNICODE 转换为tiān
         * 
         */
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        pinyin = null;
    }
    
    /**
     * 对单个字进行转换
     * @param pinYinStr 需转换的汉字字符串
     * @return 拼音字符串数组
     */
    public String getCharPinYin(char pinYinStr){
        
        try 
        {
            //执行转换
            pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);
            
        } catch (BadHanyuPinyinOutputFormatCombination e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //pinyinj规则,当转换的符串不是汉字,就返回null
        if(pinyin == null){
            return null;
        }
        
        //多音字会返回一个多音字拼音的数组,pinyiinj并不能有效判断该字的读音
        return pinyin[];
    }
    
    /**
     * 对单个字进行转换
     * @param pinYinStr
     * @return
     */
    public String getStringPinYin(String pinYinStr){
        StringBuffer sb = new StringBuffer();
        String tempStr = null;
        //循环字符串
        for(int i =; i<pinYinStr.length(); i++)
        {

            tempStr = this.getCharPinYin(pinYinStr.charAt(i));
            if(tempStr == null)
            {
                //非汉字直接拼接
                sb.append(pinYinStr.charAt(i));
            }
            else
            {
                sb.append(tempStr);
            }
        }
        
        return sb.toString();
        
    }
}

测试

 import javax.annotation.Resource;

import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.SpringJUnit4ClassRunner;

import com.lovo.utils.ChangeToPinYin;

@RunWith(SpringJUnitClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class ToPinYinTest {

    @Resource
    private ChangeToPinYin changeToPinYin;
    
    @Test
    public void changePinYinTest(){
        String str = "你在做什么?what are you nong sa lie?";
        
        System.out.println(changeToPinYin.getStringPinYin(str));
    }
    
    @Ignore
    public void changechar(){
        char c = '你';
        System.out.println(changeToPinYin.getCharPinYin(c));
    }
    
    
}

测试结果

第二个方法使用JPinyin,说是在pinyin4j的jar上进行了优化,可以实现汉字转换为拼音,并自动识别常用多音字,还支持简体转换为繁体,检查是否为简体,是否为繁体,是否为中文字符等功能,下面一段代码简单列举了下汉字转换拼音及简体转换繁体

 package com.lovo.utils;


import opensource.jpinyin.ChineseHelper;
import opensource.jpinyin.PinyinFormat;
import opensource.jpinyin.PinyinHelper;

import org.springframework.stereotype.Component;

@Component
public class ChangeToPinYinJP {

    /**
     * 转换为有声调的拼音字符串
     * @param pinYinStr 汉字
     * @return 有声调的拼音字符串
     */
    public String changeToMarkPinYin(String pinYinStr){
        
        String tempStr = null;
        
        try 
        {
            tempStr =  PinyinHelper.convertToPinyinString(pinYinStr,  " ", PinyinFormat.WITH_TONE_MARK);

        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
        
    }
    
    
    /**
     * 转换为数字声调字符串
     * @param pinYinStr 需转换的汉字
     * @return 转换完成的拼音字符串
     */
    public String changeToNumberPinYin(String pinYinStr){
        
        String tempStr = null;
        
        try 
        {
            tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITH_TONE_NUMBER);
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
        
        return tempStr;
        
    }
    
    /**
     * 转换为不带音调的拼音字符串
     * @param pinYinStr 需转换的汉字
     * @return 拼音字符串
     */
    public String changeToTonePinYin(String pinYinStr){
        
        String tempStr = null;
        
        try 
        {
            tempStr =  PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITHOUT_TONE);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
        
    }
    
    /**
     * 转换为每个汉字对应拼音首字母字符串
     * @param pinYinStr 需转换的汉字
     * @return 拼音字符串
     */
    public String changeToGetShortPinYin(String pinYinStr){
        
        String tempStr = null;
        
        try 
        {
            tempStr = PinyinHelper.getShortPinyin(pinYinStr);
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
        return tempStr;
        
    }
    
    /**
     * 检查汉字是否为多音字
     * @param pinYinStr 需检查的汉字
     * @return true 多音字,false 不是多音字
     */
    public boolean checkPinYin(char pinYinStr){
        
        boolean check  = false;
        try
        {
            check = PinyinHelper.hasMultiPinyin(pinYinStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return check;
    }
    
    /**
     * 简体转换为繁体
     * @param pinYinStr
     * @return
     */
    public String changeToTraditional(String pinYinStr){
        
        String tempStr = null;
        try 
        {
            tempStr = ChineseHelper.convertToTraditionalChinese(pinYinStr);
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
        return tempStr;
        
    }
    
    /**
     * 繁体转换为简体
     * @param pinYinSt
     * @return
     */
    public String changeToSimplified(String pinYinSt){
        
        String tempStr = null;
        
        try 
        {
            tempStr = ChineseHelper.convertToSimplifiedChinese(pinYinSt);
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
        
        return tempStr;
        
    }
    
    //  public static void main(String[] args) {
    //      String str = "重慶 most input";
    //      ChangeToPinYinJP jp = new ChangeToPinYinJP();
    //      System.out.println(jp.changeToSimplified(str));
    //      System.out.println(jp.checkPinYin('重'));
    //  }
}

拼音转换jar还有很多其他的功能,对项目实际是很有帮助的,这里只是简单的介绍了下最基本的功能,有兴趣的可以自行去了解。