Android 联系人名字多音字的处理方法

来源:互联网 发布:无人机山区救灾优化 编辑:程序博客网 时间:2024/04/19 14:03

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         CSDN:
http://www.csdn.net
         雨季o莫忧离:http://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) 方法的起始部分加入这句判断语句。 




原创粉丝点击