Java获取汉字的大小写拼音码(汉字的拼音首字母)

import java.io.UnsupportedEncodingException;

/**
 * 获取拼音码
 * 
 * @author xmj
 *
 */
public class GetPinyinCode {

    private final static char[] en_char_Upper = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O',
            'P', 'Q', 'R', 'S', 'T', 'W', 'X', 'Y', 'Z' };
    private final static int[] posValue = { 1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212, 3472,
            3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249, 5590 };
    private final static int[] posValue2 = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 49062,
            49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52980, 53689, 54481, 55290 };

    /**
     * 获取字符串的大小写拼音码,true为大写
     * 
     * @param strChinese
     * @param bUpCase
     * @return
     */
    public static String getPYIndexStr(String strChinese, boolean bUpCase) {
        try {
            StringBuffer buffer = new StringBuffer();

            byte[] b = strChinese.getBytes("GBK");

            int i = 0;
            while (i < b.length) {
                if ((b[i] & 0xFF) > 128) {
                    int char1 = b[(i++)] & 0xFF;
                    char1 <<= 8;
                    int chart = char1 + (b[i] & 0xFF);
                    buffer.append(getPYIndexChar((char) chart, bUpCase));
                } else {
                    char c = (char) b[i];
                    if (!Character.isJavaIdentifierPart(c))
                        c = '?';
                    buffer.append(c);
                }
                i++;
            }
            return buffer.toString();
        } catch (Exception e) {
            System.out.println("取中文拼音有错" + e.getMessage());
        }
        return null;
    }

    /**
     * 获取字符
     * 
     * @param strChinese
     * @param bUpCase
     * @return
     */
    private static char getPYIndexChar(char strChinese, boolean bUpCase) {
        int charGBK = strChinese;
        char result = '~';
        if (charGBK > 45216 && charGBK < 55290) {
            for (int i = 0; i < 23; i++) {
                if (charGBK >= posValue2[i] && charGBK < posValue2[i + 1]) {
                    result = en_char_Upper[i];
                    break;
                }
            }
        }
        if (!bUpCase)
            result = Character.toLowerCase(result);
        return result;
    }

    /**
     * 获取字符串的大小写拼音码,true为大写
     * 
     * @param str
     * @param bUpCase
     * @return
     */
    public static String getPYIndexStr2(String strChinese, boolean bUpCase) {
        if (strChinese == null || strChinese.trim().length() == 0) {
            return "";
        }
        String result = "";
        for (int i = 0; i < strChinese.length(); i++) {
            try {
                result = result + getFirstLetter(strChinese.substring(i, i + 1), bUpCase);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 取得给定汉字的首字母,true为大写
     * 
     * @param chinese
     * @param bUpCase
     * @return
     * @throws UnsupportedEncodingException
     */
    private static String getFirstLetter(String strChinese, boolean bUpCase) throws UnsupportedEncodingException {
        if (strChinese == null || strChinese.trim().length() == 0) {
            return "";
        }
        strChinese = new String(strChinese.getBytes("GB2312"), "ISO8859-1");
        if (strChinese.length() > 1) {
            int ch_area_code = (int) strChinese.charAt(0) - 160;// 汉字区码
            int ch_bit_code = (int) strChinese.charAt(1) - 160; // 汉字位码
            int ch_code = ch_area_code * 100 + ch_bit_code; // 汉字区位码
            if (ch_code > 1600 && ch_code < 5590) {
                for (int i = 0; i < 23; i++) {
                    if (ch_code >= posValue[i] && ch_code < posValue[i + 1]) {
                        char a = en_char_Upper[i];
                        if (!bUpCase)
                            a = Character.toLowerCase(a);
                        strChinese = String.valueOf(a);
                        break;
                    }
                }
            } else {
                strChinese = new String(strChinese.getBytes("ISO8859"), "GB2312");
                strChinese = strChinese.substring(0, 1);
            }
        }
        return strChinese;
    }

}

 

测试一下

posted @ 2021-06-01 11:05  请叫我小马驹  阅读(748)  评论(0编辑  收藏  举报