java 記錄一個漢字獲取字母的方法

記錄一個獲取漢字的方法
使用的jar包

<!-- https://mvnrepository.com/artifact/com.github.liuzhuoming23/pinyin4j-spring-boot-starter -->
        <dependency>
            <groupId>com.github.liuzhuoming23</groupId>
            <artifactId>pinyin4j-spring-boot-starter</artifactId>
            <version>0.0.4</version>
        </dependency>

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

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 Pinyin4jUtil {

    /**
     * 提取首個字符的首字母婉烟,其他返回*
     * 
     * @param str
     * @return String
     */
    public static String getFirstPinYinHeadChar(String str) {

        StringBuffer pybf = new StringBuffer();
        char word = str.charAt(0);
        // 提取漢字的首字母
        String[] pinyinArray;
        // 是否是因為字母
        if (word > 128) {
            pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
            // 如果不是漢字浮还,就返回*
            if (pinyinArray != null) {
                pybf.append(pinyinArray[0].charAt(0));
            } else {
                pybf.append("*");
            }
        } else {

            // 是字母直接返回,不是返回*
            if (Character.isLetter(word)) {
                pybf.append(word);
            } else {
                pybf.append("*");
            }
        }

        // 全部返回大寫
        return pybf.toString().toUpperCase();
    }

    /**
     * 將漢字轉(zhuǎn)換為全拼
     * 
     * @param src
     * @return String
     */
    public static String getPinYin(String src) {
        char[] t1 = null;
        t1 = src.toCharArray();
        // System.out.println(t1.length);
        String[] t2 = new String[t1.length];
        // System.out.println(t2.length);
        // 設(shè)置漢字拼音輸出的格式
        HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
        t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        t3.setVCharType(HanyuPinyinVCharType.WITH_V);
        String t4 = "";
        int t0 = t1.length;
        try {
            for (int i = 0; i < t0; i++) {
                // 判斷是否為漢字字符
                // System.out.println(t1[i]);
                if (Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);// 將漢字的幾種全拼都存到t2數(shù)組中
                    t4 += t2[0];// 取出該漢字全拼的第一種讀音并連接到字符串t4后
                } else {
                    // 如果不是漢字字符浙炼,直接取出字符并連接到字符串t4后
                    t4 += Character.toString(t1[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return t4;
    }

    /**
     * 提取每個漢字的首字母
     * 
     * @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;
    }

    /**
     * 將字符串轉(zhuǎn)換成ASCII碼
     * 
     * @param cnStr
     * @return String
     */
    public static String getCnASCII(String cnStr) {
        StringBuffer strBuf = new StringBuffer();
        // 將字符串轉(zhuǎn)換成字節(jié)序列
        byte[] bGBK = cnStr.getBytes();
        for (int i = 0; i < bGBK.length; i++) {
            // System.out.println(Integer.toHexString(bGBK[i] & 0xff));
            // 將每個字符轉(zhuǎn)換成ASCII碼
            strBuf.append(Integer.toHexString(bGBK[i] & 0xff) + " ");
        }
        return strBuf.toString();
    }

    /**
     * 漢字轉(zhuǎn)換位漢語拼音首字母是尖,英文字符不變,特殊字符丟失 支持多音字,生成方式如(長沙市長:cssc,zssz,zssc,cssz)
     * 
     * @param chines
     *            漢字
     * @return 拼音
     */
    public static String converterToFirstSpell(String chines) {
        StringBuffer pinyinName = new StringBuffer();
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
            if (nameChar[i] > 128) {
                try {
                    // 取得當(dāng)前漢字的所有全拼
                    String[] strs = PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat);
                    if (strs != null) {
                        for (int j = 0; j < strs.length; j++) {
                            // 取首字母
                            pinyinName.append(strs[j].charAt(0));
                            if (j != strs.length - 1) {
                                pinyinName.append(",");
                            }
                        }
                    }
                    // else {
                    // pinyinName.append(nameChar[i]);
                    // }
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pinyinName.append(nameChar[i]);
            }
            pinyinName.append(" ");
        }
        // return pinyinName.toString();
        return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));
    }

    /**
     * 漢字轉(zhuǎn)換位漢語全拼,英文字符不變,特殊字符丟失
     * 支持多音字季眷,生成方式如(重當(dāng)參:zhongdangcen,zhongdangcan,chongdangcen
     * ,chongdangshen,zhongdangshen,chongdangcan)
     * 
     * @param chines
     *            漢字
     * @return 拼音
     */
    public static String converterToSpell(String chines) {
        StringBuffer pinyinName = new StringBuffer();
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
            if (nameChar[i] > 128) {
                try {
                    // 取得當(dāng)前漢字的所有全拼
                    String[] strs = PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat);
                    if (strs != null) {
                        for (int j = 0; j < strs.length; j++) {
                            pinyinName.append(strs[j]);
                            if (j != strs.length - 1) {
                                pinyinName.append(",");
                            }
                        }
                    }
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pinyinName.append(nameChar[i]);
            }
            pinyinName.append(" ");
        }
        // return pinyinName.toString();
        return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));
    }

    /**
     * 去除多音字重復(fù)數(shù)據(jù)
     * 
     * @param theStr
     * @return
     */
    private static List<Map<String, Integer>> discountTheChinese(String theStr) {
        // 去除重復(fù)拼音后的拼音列表
        List<Map<String, Integer>> mapList = new ArrayList<Map<String, Integer>>();
        // 用于處理每個字的多音字,去掉重復(fù)
        Map<String, Integer> onlyOne = null;
        String[] firsts = theStr.split(" ");
        // 讀出每個漢字的拼音
        for (String str : firsts) {
            onlyOne = new Hashtable<String, Integer>();
            String[] china = str.split(",");
            // 多音字處理
            for (String s : china) {
                Integer count = onlyOne.get(s);
                if (count == null) {
                    onlyOne.put(s, new Integer(1));
                } else {
                    onlyOne.remove(s);
                    count++;
                    onlyOne.put(s, count);
                }
            }
            mapList.add(onlyOne);
        }
        return mapList;
    }

    /**
     * 解析并組合拼音卷胯,對象合并方案(推薦使用)
     * 
     * @return
     */
    private static String parseTheChineseByObject(List<Map<String, Integer>> list) {
        Map<String, Integer> first = null; // 用于統(tǒng)計每一次,集合組合數(shù)據(jù)
        // 遍歷每一組集合
        for (int i = 0; i < list.size(); i++) {
            // 每一組集合與上一次組合的Map
            Map<String, Integer> temp = new Hashtable<String, Integer>();
            // 第一次循環(huán)子刮,first為空
            if (first != null) {
                // 取出上次組合與此次集合的字符,并保存
                for (String s : first.keySet()) {
                    for (String s1 : list.get(i).keySet()) {
                        String str = s + s1;
                        temp.put(str, 1);
                    }
                }
                // 清理上一次組合數(shù)據(jù)
                if (temp != null && temp.size() > 0) {
                    first.clear();
                }
            } else {
                for (String s : list.get(i).keySet()) {
                    String str = s;
                    temp.put(str, 1);
                }
            }
            // 保存組合數(shù)據(jù)以便下次循環(huán)使用
            if (temp != null && temp.size() > 0) {
                first = temp;
            }
        }
        String returnStr = "";
        if (first != null) {
            // 遍歷取出組合字符串
            for (String str : first.keySet()) {
                returnStr += (str + ",");
            }
        }
        if (returnStr.length() > 0) {
            returnStr = returnStr.substring(0, returnStr.length() - 1);
        }
        return returnStr;
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窑睁,一起剝皮案震驚了整個濱河市挺峡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌担钮,老刑警劉巖橱赠,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箫津,居然都是意外死亡狭姨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門苏遥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饼拍,“玉大人,你說我怎么就攤上這事田炭∈Τ” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵教硫,是天一觀的道長叨吮。 經(jīng)常有香客問我辆布,道長,這世上最難降的妖魔是什么茶鉴? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任锋玲,我火速辦了婚禮,結(jié)果婚禮上蛤铜,老公的妹妹穿的比我還像新娘嫩絮。我一直安慰自己,他們只是感情好围肥,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布剿干。 她就那樣靜靜地躺著,像睡著了一般穆刻。 火紅的嫁衣襯著肌膚如雪置尔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天氢伟,我揣著相機與錄音榜轿,去河邊找鬼。 笑死朵锣,一個胖子當(dāng)著我的面吹牛谬盐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诚些,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼飞傀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诬烹?” 一聲冷哼從身側(cè)響起砸烦,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤畦粮,失蹤者是張志新(化名)和其女友劉穎雳灵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皆看,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡家破,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年颜说,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汰聋。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脑沿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出马僻,到底是詐尸還是另有隱情庄拇,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站措近,受9級特大地震影響溶弟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞭郑,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一辜御、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屈张,春花似錦擒权、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至场绿,卻和暖如春剖效,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焰盗。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工璧尸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熬拒。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓爷光,卻偏偏與公主長得像,于是被迫代替她去往敵國和親澎粟。 傳聞我的和親對象是個殘疾皇子瞎颗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354