Android 聯系人名字多音字的處理方法

前言

         歡迎大傢我分享和推薦好用的代碼段~~

聲明

         歡迎轉載,但請保留文章原始出處:

         CSDN:https://www.csdn.net

         雨季o莫憂離:https://blog.csdn.net/luckkof

正文

 

Android在處理多音字的時候使用的是HanziToPinyin.java這個類,該轉換類實現瞭讀入漢字的unicode碼轉換及對應Pinyin的sortKey生成。

 

當輸入的是中文的時候就會進入這個轉換類進行soryKey的生成。我們發現【沈】在其分析時候被認作瞭【chen】進行處理,查看字典發現【沈】是個多音字,也有【chen】的讀音,隻是我們不常用到【chen】這個讀音,但是android在對應unicode碼時加入瞭這個多音字的映射,且如果有兩個讀音,會自動匹配到首字母在前面的讀音。

 

如:【調】à【diao】而不是【tiao】

 

      【單】à【dan】而不是【shan】

 

而2.3的處理中【沈】à【shen】, 【單】à【dan】,HanziToPinyin.java與4.0卻是一致的,由此可見,4.0對於漢字的處理相對於2.3並沒有發生變化,而是4.0將不常用的多音字也加入瞭進來,字庫比2.3更全。

 

這個問題對於google來說應該不算是問題,對於多音字的支持是google在字庫上面的更全面的增加,它不會關心多音字是否常用。

 

解決辦法:

若需要修改這個對應關系,我們提供一個解決方法去修改名子的sortKey。

方法如下:

 

在HanziToPinyin.java其中添加瞭一個specialCharacters變量,是個unicode碼對應的map.

然後在下面的gettoken方法裡面來判斷輸入的字符是否是自己定義的多音字字符。如果是,那麼將多音字強行指向指定的讀音下面。

 

如:沈–〉審

 

    賈–〉甲

 

    俞–〉於

 

目前有三個不常見的多音字的被加入到瞭Map中,後續如再發現不常用的多音字,按照如上方式加入到map中即可。

 

代碼片段如下:

 

public static Map<String,Character> specialHanzi = new HashMap<String,Character>();  
  
     
  
    static {  
  
                                // A  
  
                                // B  
  
                                // C  
  
                                // D  
  
                                // E  
  
                                // F  
  
                                // G  
  
                                // H  
  
                                // I  
  
                                // J  
  
                specialHanzi.put("8d3e", '\u7532');//賈->甲  
  
                                // K  
  
                                // L  
  
                                // M  
  
                                // N  
  
                                // O  
  
                                // P  
  
                                // Q  
  
                                // R  
  
                                // S  
  
                specialHanzi.put("6c88", '\u5ba1');//沈->審  
  
                                // T  
  
                                // U  
  
                                // V  
  
                                // W  
  
                                // X  
  
                                // Y  
  
                specialHanzi.put("4fde", '\u4e8e');//俞->於  
  
                                // Z  
  
    }  
  
首先定義這個map,  
  
    private Token getToken(char character) {  
  
                if (specialHanzi.get(Integer.toHexString(character)) != null) {  
  
                                character = specialHanzi.get(Integer.toHexString(character));  
  
                }  
  
在private Token getToken(char character) 方法的起始部分加入這句判斷語句。  

發佈留言