工具類之PinyinUtils

前言:年底了,最近都比較忙,每天能抽出的時(shí)間也有點(diǎn)少,而且,現(xiàn)在都在努力解決之前的bug,由于github上有同志提出來(lái)了拼音工具類有部分漢字識(shí)別出錯(cuò),這不,趁這兩天借鑒了其他的實(shí)現(xiàn)方式,立馬開(kāi)車擼碼,因?yàn)榇蟛糠质怯迷诟帐舷嚓P(guān),所以對(duì)姓氏做了多音字,普通的拼音識(shí)別并沒(méi)有多音字識(shí)別哦,如需實(shí)現(xiàn),那就依賴第三方開(kāi)源庫(kù)--pinyin4j吧,緊接著,那就發(fā)車咯。

上車須知

首先先看下單元測(cè)試吧,看是否入老司機(jī)們的法眼。

澹臺(tái): tantai
尉遲: yuchi
萬(wàn)俟: moqi
單于: chanyu
樂(lè) 正確: yue    首字母: y      錯(cuò)誤: le    
乘 正確: sheng  首字母: s      錯(cuò)誤: cheng 
乜 正確: nie    首字母: n      錯(cuò)誤: mie   
仇 正確: qiu    首字母: q      錯(cuò)誤: chou  
會(huì) 正確: gui    首字母: g      錯(cuò)誤: hui   
便 正確: pian   首字母: p      錯(cuò)誤: bian  
區(qū) 正確: ou     首字母: o      錯(cuò)誤: qu    
單 正確: shan   首字母: s      錯(cuò)誤: dan   
參 正確: shen   首字母: s      錯(cuò)誤: can   
句 正確: gou    首字母: g      錯(cuò)誤: ju    
召 正確: shao   首字母: s      錯(cuò)誤: zhao  
員 正確: yun    首字母: y      錯(cuò)誤: yuan  
宓 正確: fu     首字母: f      錯(cuò)誤: mi    
弗 正確: fei    首字母: f      錯(cuò)誤: fu    
折 正確: she    首字母: s      錯(cuò)誤: zhe   
曾 正確: zeng   首字母: z      錯(cuò)誤: ceng  
樸 正確: piao   首字母: p      錯(cuò)誤: po    
查 正確: zha    首字母: z      錯(cuò)誤: cha   
洗 正確: xian   首字母: x      錯(cuò)誤: xi    
蓋 正確: ge     首字母: g      錯(cuò)誤: gai   
祭 正確: zhai   首字母: z      錯(cuò)誤: ji    
種 正確: chong  首字母: c      錯(cuò)誤: zhong 
秘 正確: bi     首字母: b      錯(cuò)誤: mi    
繁 正確: po     首字母: p      錯(cuò)誤: fan   
繆 正確: miao   首字母: m      錯(cuò)誤: mou   
能 正確: nai    首字母: n      錯(cuò)誤: neng  
蕃 正確: pi     首字母: p      錯(cuò)誤: fan   
覃 正確: qin    首字母: q      錯(cuò)誤: tan   
解 正確: xie    首字母: x      錯(cuò)誤: jie   
諶 正確: shan   首字母: s      錯(cuò)誤: chen  
適 正確: kuo    首字母: k      錯(cuò)誤: shi   
都 正確: du     首字母: d      錯(cuò)誤: dou   
阿 正確: e      首字母: e      錯(cuò)誤: a     
難 正確: ning   首字母: n      錯(cuò)誤: nan   
黑 正確: he     首字母: h      錯(cuò)誤: hei   
用時(shí): 14ms
單元測(cè)試: d,y,c,s,
單: d
元: y
測(cè): c
試: s
已初始化的漢字轉(zhuǎn)拼音用時(shí)測(cè)試: yi chu shi hua de han zi zhuan pin yin yong shi ce shi 
用時(shí): 0ms

站點(diǎn)

ccs2Pinyin           : 漢字轉(zhuǎn)拼音
ccs2Pinyin           : 漢字轉(zhuǎn)拼音
getPinyinFirstLetter : 獲取第一個(gè)漢字首字母
getPinyinFirstLetters: 獲取所有漢字的首字母
getSurnamePinyin     : 根據(jù)名字獲取姓氏的拼音
getSurnameFirstLetter: 根據(jù)名字獲取姓氏的首字母

具體路線

import android.support.v4.util.SimpleArrayMap;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 16/11/16
 *     desc  : 拼音相關(guān)工具類
 * </pre>
 */
public class PinyinUtils {

    private PinyinUtils() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }

    /**
     * 漢字轉(zhuǎn)拼音
     *
     * @param ccs 漢字字符串(Chinese characters)
     * @return 拼音
     */
    public static String ccs2Pinyin(CharSequence ccs) {
        return ccs2Pinyin(ccs, "");
    }

    /**
     * 漢字轉(zhuǎn)拼音
     *
     * @param ccs   漢字字符串(Chinese characters)
     * @param split 漢字拼音之間的分隔符
     * @return 拼音
     */
    public static String ccs2Pinyin(CharSequence ccs, CharSequence split) {
        if (ccs == null || ccs.length() == 0) return null;
        StringBuilder sb = new StringBuilder();
        for (int i = 0, len = ccs.length(); i < len; i++) {
            char ch = ccs.charAt(i);
            if (ch >= 0x4E00 && ch <= 0x9FA5) {
                int sp = (ch - 0x4E00) * 6;
                sb.append(pinyinTable.substring(sp, sp + 6).trim());
            } else {
                sb.append(ch);
            }
            sb.append(split);
        }
        return sb.toString();
    }

    /**
     * 獲取第一個(gè)漢字首字母
     *
     * @param ccs 漢字字符串(Chinese characters)
     * @return 拼音
     */
    public static String getPinyinFirstLetter(CharSequence ccs) {
        if (ccs == null || ccs.length() == 0) return null;
        return ccs2Pinyin(String.valueOf(ccs.charAt(0))).substring(0, 1);
    }

    /**
     * 獲取所有漢字的首字母
     *
     * @param ccs 漢字字符串(Chinese characters)
     * @return 所有漢字的首字母
     */
    public static String getPinyinFirstLetters(CharSequence ccs) {
        return getPinyinFirstLetters(ccs, "");
    }

    /**
     * 獲取所有漢字的首字母
     *
     * @param ccs   漢字字符串(Chinese characters)
     * @param split 首字母之間的分隔符
     * @return 所有漢字的首字母
     */
    public static String getPinyinFirstLetters(CharSequence ccs, CharSequence split) {
        if (ccs == null || ccs.length() == 0) return null;
        int len = ccs.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            sb.append(ccs2Pinyin(String.valueOf(ccs.charAt(i))).substring(0, 1)).append(split);
        }
        return sb.toString();
    }

    /**
     * 根據(jù)名字獲取姓氏的拼音
     *
     * @param name 名字
     * @return 姓氏的拼音
     */
    public static String getSurnamePinyin(CharSequence name) {
        if (name == null || name.length() == 0) return null;
        if (name.length() >= 2) {
            CharSequence str = name.subSequence(0, 2);
            if (str.equals("澹臺(tái)")) return "tantai";
            else if (str.equals("尉遲")) return "yuchi";
            else if (str.equals("萬(wàn)俟")) return "moqi";
            else if (str.equals("單于")) return "chanyu";
        }
        char ch = name.charAt(0);
        if (surnames.containsKey(ch)) {
            return surnames.get(ch);
        }
        if (ch >= 0x4E00 && ch <= 0x9FA5) {
            int sp = (ch - 0x4E00) * 6;
            return pinyinTable.substring(sp, sp + 6).trim();
        } else {
            return String.valueOf(ch);
        }
    }

    /**
     * 根據(jù)名字獲取姓氏的首字母
     *
     * @param name 名字
     * @return 姓氏的首字母
     */
    public static String getSurnameFirstLetter(CharSequence name) {
        String surname = getSurnamePinyin(name);
        if (surname == null || surname.length() == 0) return null;
        return String.valueOf(surname.charAt(0));
    }

    // 多音字姓氏映射表
    private static final SimpleArrayMap<Character, String> surnames;

    /**
     * 獲取拼音對(duì)照表,對(duì)比過(guò)pinyin4j和其他方式,這樣查表設(shè)計(jì)的好處就是讀取快
     * <p>當(dāng)該類加載后會(huì)一直占有123KB的內(nèi)存</p>
     * <p>如果你想存進(jìn)文件,然后讀取操作的話也是可以,但速度肯定沒(méi)有這樣空間換時(shí)間快,畢竟現(xiàn)在設(shè)備內(nèi)存都很大</p>
     * <p>如需更多用法可以用pinyin4j開(kāi)源庫(kù)</p>
     */
    private static final String pinyinTable;

    static {
        surnames = new SimpleArrayMap<>(35);
        surnames.put('樂(lè)', "yue");
        surnames.put('乘', "sheng");
        surnames.put('乜', "nie");
        surnames.put('仇', "qiu");
        surnames.put('會(huì)', "gui");
        surnames.put('便', "pian");
        surnames.put('區(qū)', "ou");
        surnames.put('單', "shan");
        surnames.put('參', "shen");
        surnames.put('句', "gou");
        surnames.put('召', "shao");
        surnames.put('員', "yun");
        surnames.put('宓', "fu");
        surnames.put('弗', "fei");
        surnames.put('折', "she");
        surnames.put('曾', "zeng");
        surnames.put('樸', "piao");
        surnames.put('查', "zha");
        surnames.put('洗', "xian");
        surnames.put('蓋', "ge");
        surnames.put('祭', "zhai");
        surnames.put('種', "chong");
        surnames.put('秘', "bi");
        surnames.put('繁', "po");
        surnames.put('繆', "miao");
        surnames.put('能', "nai");
        surnames.put('蕃', "pi");
        surnames.put('覃', "qin");
        surnames.put('解', "xie");
        surnames.put('諶', "shan");
        surnames.put('適', "kuo");
        surnames.put('都', "du");
        surnames.put('阿', "e");
        surnames.put('難', "ning");
        surnames.put('黑', "he");

        pinyinTable = new StringBuilder(125412).toString();//由于表太長(zhǎng),請(qǐng)參看源碼
    }
}

終點(diǎn)站

為了實(shí)現(xiàn)姓氏多音字,我也是大費(fèi)周折地找了很多,如果你們覺(jué)得有所不足或錯(cuò)誤,那么歡迎留言,好了,終點(diǎn)站到了,如果對(duì)本次旅途滿意的話,請(qǐng)給五星好評(píng)哦,畢竟老司機(jī)這次真的犧牲了很多時(shí)間才換來(lái)這么一份工具類,如果該工具類依賴其他工具類,都可以在我的Android開(kāi)發(fā)人員不得不收集的代碼(持續(xù)更新中)中找到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評(píng)論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,781評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,588評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,315評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,699評(píng)論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,882評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,189評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,388評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,613評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,023評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,310評(píng)論 1 293
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,112評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,334評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容