中文轉拼音 pinyin4j的使用

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));// 全拼
        }
    }
}
相關文章
相關標籤/搜索