import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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;

/**
* 拼音使用工具类 </br> 功能: 输入汉字取得拼音。 <br>
* 使用Pinyin4j.jar
*
*/
public class PinyinUtil {

/**
* 获取中文汉字拼音 默认输出
*
* @param chinese
* 中文汉字
* @return
*/
public static String getPinyin(String chinese) {
return getPinyinZh_CN(convertStringByChinese(chinese));
}

/**
* 拼音大写输出
*
* @param chinese
* 中文汉字
* @return
*/
public static String getPinyinToUpperCase(String chinese) {
return getPinyinZh_CN(convertStringByChinese(chinese)).toUpperCase();
}

/**
* 拼音小写输出
*
* @param chinese
* 中文汉字
* @return
*/
public static String getPinyinToLowerCase(String chinese) {
return getPinyinZh_CN(convertStringByChinese(chinese)).toLowerCase();
}

/**
* 首字母大写输出
*
* @param chinese
* 中文汉字
* @return
*/
public static String getPinyinFirstToUpperCase(String chinese) {
return getPinyin(chinese);
}

/**
* Default Format 默认输出格式 小或大写、 没有音调数字、u显示
*
* @param isLowerCase
* 是否小写
* @return
*/
private static HanyuPinyinOutputFormat getDefaultFormat() {
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 小写
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 没有音调数字
format.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);// u显示
return format;
}

/**
* 字符集转换
*
* @param chinese
* 中文汉字
* @throws BadHanyuPinyinOutputFormatCombination
*/
private static Set<String> convertStringByChinese(String chinese) {
char[] chars = chinese.toCharArray();
if (chinese != null && !chinese.trim().equalsIgnoreCase("")) {
char[] srcChar = chinese.toCharArray();
String[][] temp = new String[chinese.length()][];
for (int i = 0; i < srcChar.length; i++) {
char c = srcChar[i];
// 是中文(a-z、A-Z)转换拼音
if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")
|| String.valueOf(c).matches("[\\u3007]")) {
try {
temp[i] = PinyinHelper.toHanyuPinyinStringArray(chars[i], getDefaultFormat());

} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
temp[i] = new String[] { String.valueOf(srcChar[i]) };
}
}
String[] pingyinArray = exchange(temp);
Set<String> pinyin = new HashSet<String>();
for (int i = 0; i < pingyinArray.length; i++) {
pinyin.add(pingyinArray[i]);
}
return pinyin;
}
return null;
}

/**
* 递归
*
* @param strJaggedArray
* @return
*/
private static String[] exchange(String[][] strJaggedArray) {
String[][] temp = doExchange(strJaggedArray);
return temp[0];
}

/**
* 递归
*
* @param strJaggedArray
* @return
*/
private static String[][] doExchange(String[][] strJaggedArray) {
int len = strJaggedArray.length;
if (len >= 2) {
int len1 = strJaggedArray[0].length;
int len2 = strJaggedArray[1].length;
int newlen = len1 * len2;
String[] temp = new String[newlen];
int index = 0;
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
temp[index] = capitalize(strJaggedArray[0][i])
+ capitalize(strJaggedArray[1][j]);
index++;
}
}
String[][] newArray = new String[len - 1][];
for (int i = 2; i < len; i++) {
newArray[i - 1] = strJaggedArray[i];
}
newArray[0] = temp;
return doExchange(newArray);
} else {
return strJaggedArray;
}
}

/**
* 首字母大写
*
* @param s
* @return
*/
private static String capitalize(String s) {
char[] ch = s.toCharArray();
if (ch != null && ch.length > 0) {
if (ch[0] >= 'a' && ch[0] <= 'z')
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}

/**
* 字符串集合转换字符串(逗号分隔)
*
* @param stringSet
* @return
*/
private static String getPinyinZh_CN(Set<String> stringSet) {
StringBuilder str = new StringBuilder();
int i = 0;
for (String s : stringSet) {
if (i == stringSet.size() - 1) {
str.append(s);
} else {
str.append(s + ",");
}
i++;
}
return str.toString();
}

/**
* 返回中文的首字母
*
* @param chinese
* @return
*/
public static String getPinYinHeadChar(String chinese) {
StringBuffer pinyin = new StringBuffer();
if (chinese != null && !chinese.trim().equalsIgnoreCase("")) {
for (int j = 0; j < chinese.length(); j++) {
char word = chinese.charAt(j);
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
pinyin.append(pinyinArray[0].charAt(0));
} else {
pinyin.append(word);
}
}
}
return pinyin.toString();
}

/**
* 去除特殊字符
* @param cnStr
* @return
*/
public static String strFilter(String str) throws PatternSyntaxException {
// 只允许字母和数字
// String regEx = "[^a-zA-Z0-9]";
// 清除掉所有特殊字符
String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?\"]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}

/**
* 返回中文的首字母并过滤特殊字符输出
* @param chinese
* @return
*/
public static String getPinYinHeadCharFilter(String chinese) {
return strFilter(getPinYinHeadChar(chinese));
}

/**
* Test 测试
*
* @param args
*/
public static void main(String[] args) throws Exception{
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
// UPPERCASE:大写 (ZHONG)
// LOWERCASE:小写 (zhong)
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
// WITHOUT_TONE:无音标 (zhong)
// WITH_TONE_NUMBER:1-4数字表示英标 (zhong4)
// WITH_TONE_MARK:直接用音标符(必须WITH_U_UNICODE否则异常) (zhòng)
format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
// WITH_V:用v表示ü (nv)
// WITH_U_AND_COLON:用"u:"表示ü (nu:)
// WITH_U_UNICODE:直接用ü (nü)
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);

char word = '区';
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word,format);
for(String e:pinyinArray){
System.out.println(e);//shou
}
// Logger logger = LoggerFactory.getLogger(PinyinUtil.class);
// logger.info(pinyinArray.toString() );
// String str = "〇的输¥¥#s,ldsa";
// logger.info("小写输出:" + getPinyinToLowerCase(str));
// logger.info("大写输出:" + getPinyinToUpperCase(str));
// logger.info("首字母大写输出:" + getPinyinFirstToUpperCase(str));
// logger.info("返回中文的首字母输出:" + getPinYinHeadChar(str));
// logger.info("返回中文的首字母并过滤特殊字符输出:" + getPinYinHeadCharFilter(str));

}

}

PinyinUtil的更多相关文章

  1. 拼音操作工具类 - PinyinUtil.java

    拼音操作工具类,提供字符串转换成拼音数组.汉字转换成拼音.取汉字的首字母等方法. 源码如下:(点击下载 -PinyinUtil.java.pinyin4j-2.5.0.jar ) import net ...

  2. java加拼音的工具 pinyinutil

    <!--汉字转拼音--> <dependency> <groupId>com.belerweb</groupId> <artifactId> ...

  3. JavaScript 汉字与拼音互转终极方案 附JS拼音输入法

    转:http://www.codeceo.com/article/javascript-pinyin.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的 ...

  4. 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法

    前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...

  5. java 中文转化为拼音

    依赖架包:pinyin4j.jar package net.jeeshop.core.util; import net.sourceforge.pinyin4j.PinyinHelper; impor ...

  6. java 汉语转拼音(全拼,首字母)

    import java.util.*; import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.for ...

  7. java中汉字自动转换成拼音

    java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...

  8. pinyin4j使用示例

    pinyin4j的主页:http://pinyin4j.sourceforge.net/pinyin4j能够根据中文字符获取其对应的拼音,而且拼音的格式可以定制pinyin4j是一个支持将中文转换到拼 ...

  9. java 汉字转拼音

    先决条件: pinyin4j.jar(Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换.拼音输出格式可以定制.) 下载地址:http://pan.baidu.com/share/l ...

随机推荐

  1. 在 Ubuntu 14.04 服务器上部署 Hexo 博客

    版权声明:本文由宋秉金 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/241080001487926962 来源:腾云阁  ...

  2. vbox 的 ova 提取vmdk 与 vdi 以及扩容

    原文: http://blog.csdn.net/flm2003/article/details/11980863 1. 从ova提取vmdk: tar xvf oldImage.ova => ...

  3. python如何去掉字符串‘\xa0’

    发现问题: 最近在用爬虫爬取网页信息时,在网页源码中遇到了“&nbsp"字符串,经查阅,发现该字符是不间断空格符.我们通常所用的空格是 \x20 ,是在标准ASCII可见字符 0x2 ...

  4. django高并发优化

    我开始对web开发产生了兴趣,并决定自己也尝试开发一个网站.在此之前,我做过3年的java application的开发,对web开发应该算一无所知.在比较了java,php,ror,和python后 ...

  5. 试水Spring Cloud Hystrix

    Spring Cloud Hystrix是一个容错库,它实现了断路器模式,使得当服务发生异常时,会自动切断连接,并将请求引导至预设的回调方法. 服务端 在Spring Tool Suite的文件菜单中 ...

  6. STM FLASH在线编程 升级

    注意字节到 stm flash 顺序是反的 例如 12 34 56 78 世纪写入内存 应该是 78 56 34 12

  7. SQLServer 查询数据死锁语句

    SQLServer 查询数据死锁语句   我们可以通过以下SQL 语句用来查询,当前数据中存在的死锁语句,定位数据库出现死锁的根本原因.   --每秒死锁数量 SELECT * FROM sys.dm ...

  8. python-----双色球实现(实例1)

    #输出用户指定组数的双色球信息,其中一组信息 6个红色号码获取范围(1-33),1个蓝色号码获取范围(1-16),要求一组信息中红球内号码不可重复 import randomdef get_ball( ...

  9. mail 发送email

    (一)首先安装ssmpt和mailutils: sudo apt-get install ssmtp mailutils (二)接下来编辑配置文件sudo gedit /etc/ssmtp/ssmtp ...

  10. spark学习笔记2

    SparkContext代表和一个集群的连接 在shell中SparkContext是自动创建好的,就是sc