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

转载自  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 blocke.printStackTrace();}//pinyin4j规则,当转换的符串不是汉字,就返回nullif(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 {@Resourceprivate ChangeToPinYin changeToPinYin;@Testpublic void changePinYinTest(){String str = "你在做什么?what are you nong sa lie?";System.out.println(changeToPinYin.getStringPinYin(str));}@Ignorepublic 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还有很多其他的功能,对项目实际是很有帮助的,这里只是简单的介绍了下最基本的功能,有兴趣的可以自行去了解。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给数据库表字段设置默认值

一、在数据库表中的操作方法 当表中的字段是varchar字段时可以这样设置&#xff1a; 例如我要设置stats&#xff08;状态这个字段默认为"1"&#xff09;&#xff0c;在创建表的时候sql语句可以这样写 stats varchar(1) CHARACTER SET utf8 NOT NULL DEFAULT 1 COMM…

Myeclipse创建第一个web项目

创建web项目 web project 创建java项目 选java project

使用cardme读写VCard文件,实现批量导入导出电话簿

转载自 使用cardme读写VCard文件&#xff0c;实现批量导入导出电话簿首先下载jar包cardme。 http://sourceforge.net/projects/cardme/?sourcenavbar cardme是基于java语言的操作vCard(后缀vcf)文件的开源项目。 在项目中有一个类net.sourceforge.cardme.engine.TestParser。是…

.NET Core系列 :4 测试

2016.6.27 微软已经正式发布了.NET Core 1.0 RTM&#xff0c;但是工具链还是预览版&#xff0c;同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The State of .Net Core Testing Today 就将各个开源测试库的目前进展进行了汇总。本文我们的目的是在…

java高效字符串首字母大小写转换

通过找到一个移动ASCII的方式来处理字符串首字母大小写的问题 我们都知道在ascii 码表中 a的ASCIII码值是65而A的ASCII码值是 97 两个之间的差值是 32&#xff0c;所以&#xff0c;如果我们需要把一个小写字母转化成大写字母&#xff0c;那么我们只需要把这个 char 字符的asci…

java面向对象高级分层实例_BaseDao

package bdqn.studentSys.Dao; /*** 数据库帮助类* author Administrator**/ import java.sql.*; public class BaseDao {Connection connnull;PreparedStatement psnull;ResultSet rsnull;//连接数据库public void getConnection(){try {Class.forName("com.microsoft.sq…

Myeclipse 创建web项目的一些基本操作

上面是tomcat的工作路径 什么是工作路径呢&#xff1f; 启动tomcat 就开始监听8080端口了 在浏览器数据url 请求web请求 就会显示出index.jsp 上篇博客中有讲到更改tomcat端口 但是在运行中的修改是不会生效的 必须停止 再重启 怎么引入jar包&#xff1f; 支持中文 这样…

Java制作VCARD

转载自 Java制作VCARD 简介: vCard是电子名片的文件格式标准。它一般附加在电子邮件之后,但也可以用于其它场合(如在互联网上相互交换)。vCard可包含的信息有:姓名、地址资讯、电话号码、URL,logo,相片等。——摘自维基百科https://zh.wikipedia.org/wiki/VCardvCard规范容许…

java反射机制的简单使用和优缺点

java反射机制的使用 一、反射是什么&#xff1f; JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取类信息以及动态调…

有关技术分享

有人说&#xff0c;如果你想掌握好一门技术&#xff0c;那么最好的方式就是去当老师&#xff0c;去教会别人这门技术。在教别人的过程中&#xff0c;你必须要去深入的了解这门技术的方方面面&#xff0c;同时还要思考怎么才能让别人理解。每一个做过的人都知道&#xff0c;这要…

不可重复 幻读

幻读和不可重复读的区别 2014年09月15日 20:51:27 阅读数&#xff1a;26195 MySQl MySql默认的隔离级别为Repeatable Read&#xff0c;因此只会出现幻读的情况。 幻读 事务在插入已经检查过不存在的记录时&#xff0c;惊奇的发现这些数据已经存在了&#xff0c;之前的检测…

java生成验证码

转载自 java生成验证码 源码&#xff1a; package seed.lee.image;import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;import javax.imageio.ImageIO; …

ASP.NET Core 中文文档 第三章 原理(5)错误处理

原文&#xff1a;Error Handling作者&#xff1a;Steve Smith翻译&#xff1a;谢炀&#xff08;Kiler)校对&#xff1a;高嵩(jack2gs)、何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法来处理这些问题。 配置错误处理页面 你在 Startup 类的 Configure(…

java面向对象高级分层实例_接口类

package bdqn.studentSys.Dao;import java.util.List;import bdqn.studentSys.entity.Student;/*** 学生表的接口* author Administrator**/ public interface StudentDao {//查询所有的学生public List<Student> getAllStudent();//修改学生信息public int UpdateStuden…

杀死进程

-- 杀死进程端口 netstat -aon|findstr "8086" taskkill /PID 9160 /f

菜鸟学Java(六)——简单验证码生成(Java版)

转载自 菜鸟学Java&#xff08;六&#xff09;——简单验证码生成(Java版)验证码大家都知道&#xff0c;它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释&#xff0c;一般验证码的生成就是随机产生字符&#xff08;数字、字母或者汉字等&#xff09;&#xff0…

对象集合中如何用对象的某个属性给对象排序?

这是在工作中遇到的一个问题。用到的持久层技术是mybatis-plus&#xff0c;它里面自带的条件对象wrapper&#xff0c;我们可以通过wrapper.orderByDesc()或者wrapper.orderByAsc()给我们list中的对象排序。 但是问题来了&#xff0c;如果公司在基于这个框架的基础上写了一个通用…

你知道C#中的Lambda表达式的演化过程吗

那得从很久很久以前说起了&#xff0c;记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂。 委托的使用 例一&#xff1a; 什么是委托&#xff1f; 个人理解&#xff1a;用来传递方法的类型。&#xff08;用来传递数字的类型有int、float、double&#xff0c;用…

拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码

使用 apache.http. 可以解决 压缩的json文件 浏览器会自动解压但我们的后台不会package com.zjyouth.utils;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.…

java面向对象高级分层实例_数据库操作类

package bdqn.studentSys.Dao.impl; /**** 学生表的数据库操作类*/ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import bdqn.studentSys.Dao.BaseDao; import bdqn.studentSys.Dao.StudentDao; import bdqn…