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还有很多其他的功能,对项目实际是很有帮助的,这里只是简单的介绍了下最基本的功能,有兴趣的可以自行去了解。
JAVA实现汉字转换为拼音 pinyin4j/JPinyin的更多相关文章
- java实现汉字转为拼音
java实现汉字转为拼音: 1.需要导入pinyin4j.jar package com.loo.pinyin; import net.sourceforge.pinyin4j.PinyinHelpe ...
- JAVA实现汉字转拼音
两个工具包都可以实现:pinyin4j/JPinyin pinyin4j 第一个是使用pinyin4j的jar,此jar对多音字语句的处理不太理想 package edu.ws; import net ...
- iOS将汉字转换为拼音
将汉字转换为拼音 - (NSString *)chineseToPinyin:(NSString *)chinese withSpace:(BOOL)withSpace { CFStringRef h ...
- 使用PinYin4j.jar将汉字转换为拼音
package com.Test.util; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...
- JAVA将汉字转换为全拼以及返回中文的首字母,将字符串转移为ASCII码
import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseT ...
- 使用CFStringTransform将汉字转换为拼音
之前做通讯录相关的一些App时,有一个比较常用的算法是将汉字转换成拼音.当时采用的做法是:将各个拼音段的首个汉字(按Unicode排序)做成两个数组,一个数组存拼音,另一个数组存拼音对应首个汉字的Un ...
- sql函数:汉字转换为拼音
sql数据库自定义一个函数把下面代码写进去 功能是得到汉字拼音首字母create function fun_getPY(@str nvarchar(4000)) returns nvarchar(40 ...
- 汉字转换为拼音的JavaScript库
将JSPinyin剥离mootools这个JavaScript库,可以独立使用. 1)一个是将汉字翻译为拼音,其中每一个字的首字母大写: pinyin.getFullChars(this.value) ...
- js汉字转换为拼音
片段 1 片段 2 gistfile1.txt /* --- description: Pinyin, to get chinese pinyin from chinese. license: MIT ...
随机推荐
- SGU495Kids and Prizes(数学期望||概率DP||公式)
495. Kids and Prizes Time limit per test: 0.25 second(s) Memory limit: 262144 kilobytes input: stand ...
- Codeforces 1030F 【线段树】【好题】
LINK 题目大意: 给你n个物品,每一个物品有一个位置p和一个权值w,移动一个物品的代价是移动距离*物品权值 有q个询问: 把第i个物品的权值变成j 问把第l到第r个物品移动到一个相邻的区间中\([ ...
- BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】
BZOJ1412 ZJOI2009 狼和羊的故事 Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和 ...
- BZOJ1486 HNOI2009 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
- UML中的几种关系(UML Relationships)
依赖(Dependency) 依赖可以理解为一个类A使用到了另一个类B,而这种使用关系是具有偶然性的.临时性的.非常弱的,但是B类的变化会影响到A:比如某人要过河,需要借用一条船,此时人与船之间的关系 ...
- gitlab安装、配置与阿里云产品集成
https://www.ilanni.com/?p=12819 一.gitlab安装与部署 gitlab的安装可以分为源码安装和通过安装包进行安装,要是按照我以前的写作习惯的话,我也会把源码安装在本文 ...
- vim初探
https://github.com/spf13/spf13-vim 安装了此博主的开源项目. :vsp ——竖分屏 :sp ——横分屏
- 基于IAR和STM32的uCOS-II移植
网上基于MDK的移植数不胜数,但是基于IAR的移植几乎没有,因为官方的例程就是基于IAR的,所以移植起来很简单,没人介绍,但还是得小心谨慎,一不小心就出错,对于新手来说,查找错误可不是那么容易的.IA ...
- kbuild-(directory)
-INDEX - this file: info on the kernel build process kbuild.txt - developer information on kbuild kc ...
- python3 内存管理
怎么查找哪里存在内存泄露呢?武器就是两个库:gc.objgraph pip install psutil pip install objgraphpip install -U memory_profi ...