前言
在网上百度一下可以找到很多的实现,不过我这里介绍一个pinyin4j-2.5.0.jar,这个类库可以将汉字转换为待音标的以及可以将多音字转换为拼音,具体关于它的基本用法由于网上是在是汗牛充栋了,我也就不在继续介绍了,下面给出的是我根据自己的需求自己封装的常用方法,对应jar包下载请参看下面下载链接。
Jar包下载 : 360云盘 访问密码 42b4
封装pinyin4j-2.5.0
首先贴出具体代码,如果在网上看了pinyin4j-2.5.0的用法的可以很简单看懂。
package com.jay.util; 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; public class HanZi2PinYin { // 转换格式, 小写,大写,首字母大写 public static enum Type { LOWERCASE, UPPERCASE, FITST_UPPERCASE }; /** * 将汉字转换为全拼,默认为首字母大写 * * @param src * 源字符串 * * @return 转换后的字符串 */ public static String getPinYin(String src) { return getPinYin(src, Type.FITST_UPPERCASE); } /** * 将汉字按照指定格式转换为拼音 * * @param src * 源字符串 * * @param type * 转换的格式 * * @return 转换后的字符串 */ public static String getPinYin(String src, Type type) { char[] charArray = src.toCharArray(); String[] t2 = new String[charArray.length]; // 设置汉字拼音输出的格式 HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); if (type == Type.UPPERCASE) format.setCaseType(HanyuPinyinCaseType.UPPERCASE); else format.setCaseType(HanyuPinyinCaseType.LOWERCASE); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); format.setVCharType(HanyuPinyinVCharType.WITH_V); String result = ""; try { for (int i = 0; i < charArray.length; i++) { // 判断是否为汉字字符 if (Character.toString(charArray[i]).matches( "[\\u4E00-\\u9FA5]+")) { t2 = PinyinHelper.toHanyuPinyinStringArray(charArray[i], format);// 将汉字的几种全拼都存到t2数组中 char[] tt = t2[0].toCharArray(); if (type == Type.FITST_UPPERCASE) tt[0] -= 32; result += String.valueOf(tt);// 取出该汉字全拼的第一种读音并连接到字符串t4后 } else { // 如果不是汉字字符,间接取出字符并连接到字符串t4后 result += Character.toString(charArray[i]); } } } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } return result; } /** * 提取每个汉字的首字母 * * @param str * 带转换的字符串 * * @return String 转换后的字符串 */ public static String getPinYinHeadChar(String str) { String convert = ""; for (int j = 0; j < str.length(); j++) { char word = str.charAt(j); // 提取汉字的首字母 String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); if (pinyinArray != null) { convert += pinyinArray[0].charAt(0); } else { convert += word; } } return convert; } /** * 将字符串转换成ASCII码 * * @param cnStr * 待转换的字符串 * * @return String 转换以后的字符串 */ public static String getCnASCII(String cnStr) { StringBuffer strBuf = new StringBuffer(); // 将字符串转换成字节序列 byte[] bGBK = cnStr.getBytes(); for (int i = 0; i < bGBK.length; i++) { // 将每个字符转换成ASCII码 strBuf.append(Integer.toHexString(bGBK[i] & 0xff)); } return strBuf.toString(); } }
下面测试上面贴出的几个方法。
public class Main { public static void main(String[] args) throws Exception { String str = "这是(222)待转换(adbc)的字符串"; System.out.println(HanZi2PinYin.getPinYin(str)); System.out.println(HanZi2PinYin.getPinYin(str,HanZi2PinYin.Type.UPPERCASE)); System.out.println(HanZi2PinYin.getPinYinHeadChar(str)); } }
输出如下,可以看到,正确的进行了转换,并且没有丢弃噪音(()里面的内容)
ZheiShi(222)DaiZhuanHuan(adbc)DeZiFuChuan ZHEISHI(222)DAIZHUANHUAN(adbc)DEZIFUCHUAN zs(222)dzh(adbc)dzfc