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


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

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

    package com.lovo.utils;
    
    import org.springframework.stereotype.Component;
    
    import net.sourceforge.pinyin4j.PinyinHelper;
    import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
    import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
    import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
    
    /**
     * pinyin4j汉字转拼音工具类
     * @author zhiheng
     *
     */
    @Component
    public class ChangeToPinYin {
    
        //pinyin4j格式类
        private HanyuPinyinOutputFormat format = null;
        //拼音字符串数组
        private String[]pinyin;
    
        //通过构造方法进行初始化
        public ChangeToPinYin(){
    
            format = new HanyuPinyinOutputFormat();
            /*
             * 设置需要转换的拼音格式
             * 以天为例
             * HanyuPinyinToneType.WITHOUT_TONE 转换为tian
             * HanyuPinyinToneType.WITH_TONE_MARK 转换为tian1
             * 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();
            }
    
            //pinyin4j规则,当转换的符串不是汉字,就返回null
            if(pinyin == null){
                return null;
            }
    
            //多音字会返回一个多音字拼音的数组,pinyiin4j并不能有效判断该字的读音
            return pinyin[0];
        }
    
        /**
         * 对单个字进行转换
         * @param pinYinStr
         * @return
         */
        public String getStringPinYin(String pinYinStr){
            StringBuffer sb = new StringBuffer();
            String tempStr = null;
            //循环字符串
            for(int i = 0; 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.junit4.SpringJUnit4ClassRunner;
    
    import com.lovo.utils.ChangeToPinYin;
    
    @RunWith(SpringJUnit4ClassRunner.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还有很多其他的功能,对项目实际是很有帮助的,这里只是简单的介绍了下最基本的功能,有兴趣的可以自行去了解。

  • 相关阅读:
    C# WinForm TreeView改变选中节点颜色,失去焦点选中节点仍突显
    TextBox的ReadOnly属性设置为True后获取不到值
    如何设置打印机共享
    细节啊,不注意真是会很纠结
    设置access类型
    未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    带关闭的漂浮广告
    图片添加热点
    使用 WebDeploymentSetup VS 2010 Web项目部署
    动态操作表格
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/9710215.html
Copyright © 2020-2023  润新知