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

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

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值