import java.util.Objects; import org.springframework.util.StringUtils; 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; /** * 漢子轉拼音處理 * * @project common-utils * @fileName PinYin4j.java * @Description * @author light-zhang * @date 2019年3月29日 * @version 1.0.0 */ public class PinYin4j { // 設置漢字拼音輸出的格式 private static HanyuPinyinOutputFormat pinyinFormat = new HanyuPinyinOutputFormat(); static { pinyinFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); pinyinFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); pinyinFormat.setVCharType(HanyuPinyinVCharType.WITH_V); } /** * 將漢字轉換爲全拼 * * @param src * @return String */ public static String getPinYin(String src) { if (StringUtils.isEmpty(src)) { return null; } char[] srcChar = src.toCharArray(); String[] temp = new String[srcChar.length]; final StringBuffer buffer = new StringBuffer(srcChar.length); try { for (char index : srcChar) { if (isChinese(index)) { temp = PinyinHelper.toHanyuPinyinStringArray(index, pinyinFormat); if (!Objects.isNull(temp)) { buffer.append(temp[0]);// 取出該漢字全拼 } } else { buffer.append(Character.toString(index)); } } } catch (BadHanyuPinyinOutputFormatCombination e) { Assert.RuntimeException("轉換拼音出現錯誤"); } return buffer.toString(); } /** * 提取每一個漢字的首字母 * * @param str * @return String */ public static String getPinYinHeadChar(String src) { if (StringUtils.isEmpty(src)) { return null; } char[] srcChar = src.toCharArray(); final StringBuffer buffer = new StringBuffer(srcChar.length); for (char index : srcChar) { if (isChinese(index)) {// 當是中文時 String pinyinArray[] = PinyinHelper.toHanyuPinyinStringArray(index); if (!Objects.isNull(pinyinArray)) { buffer.append(pinyinArray[0].charAt(0)); } } else { buffer.append(index); } } return buffer.toString(); } /** * 將字符串轉換成ASCII碼 * * @param cnStr * @return String */ public static String getCnASCII(String src) { if (StringUtils.isEmpty(src)) { return null; } // 將字符串轉換成字節序列 byte[] bytes = src.getBytes(); final StringBuffer buffer = new StringBuffer(bytes.length); for (byte index : bytes) { // 將每一個字符轉換成ASCII碼 buffer.append(Integer.toHexString(index & 0xff)); } return buffer.toString(); } /** * 斷定輸入的是不是漢字 * * @param c 被校驗的字符 * @return true表明是漢字 */ public static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A) { return true; } return false; } public static void main(String[] args) { String fullName = "美方原先對2000億美圓中國商品加徵的關稅,english"; // System.out.println(isChinese(fullName.charAt(50))); // System.out.println(PinYin4j.getPinYin(fullName));// 全拼 // System.out.println(PinYin4j.getPinYinHeadChar(fullName));// 首拼 System.out.println(getCnASCII(fullName)); for (int i = 0; i < 1; i++) { System.out.println(PinYin4j.getPinYinHeadChar(fullName));// 首拼 System.out.println(PinYin4j.getPinYin(fullName));// 全拼 } } }