zoukankan      html  css  js  c++  java
  • 如何解决Contacts中的多音字排序错误问题

    在本文中将给出两个解决多音字排序错误的解决方案。

    以多音字曾为例,作为姓氏是读作Zeng,而android中却按Ceng来对其排序。

    方法一修改base中external/icu4c/data/coll/zh.txt文件

    拼音的排序都放在了pinyin数组中。以曾为例,被放到了C后面,我们只需把他移动到Z后面就可以了。

    方法二:在汉字转化为拼音时进行干预

    汉字转化为拼音是由HanziToPinyin.java来完成的。该类的getToken函数中定义了一个局部变量offset,

    经过与UNIHANS数组的一系列比较之后,将为该变量进行赋值,而这个值决定了这个汉字对应的拼音是什么(取PINYINS数组中offset位置的拼音)。

    所以,如果拼音错了,肯定是这个offset的值有错误。

    如果我们想纠正多音字的排序问题,我们只需给offset重新赋值即可。

    同样以曾为例。

    在getToken函数中做如下修改:

            if (cmp < 0) {
                offset--;
            }
            if (character== '\u66fe' && offset != 379) {
                Log.e("gaojx", "HanziToPinyin-->getToken()-->reset offset to 379 !!!!!");
                offset = 379;
            }
            Log.w("gaojx", "HanziToPinyin-->getToken()-->offset : " + offset);
            StringBuilder pinyin = new StringBuilder();
            for (int j = 0; j < PINYINS[offset].length && PINYINS[offset][j] != 0; j++) {
                pinyin.append((char) PINYINS[offset][j]);
            }

    注:\u66fe是曾的Unicode编码,379是拼音ZENG对应的offset

    这样,Contacts在给姓氏曾排序的时候将不会放在C下面,而是放在Z下面了。

    如何简单而快速的确定一个汉字的拼音在PINYINS数组的offset呢?

    答:在源文件中打印offset的值,创建联系人是使用该汉字作为姓名,即可打印出该汉字对应的offset了。

    两种方案修改后的文件:http://pan.baidu.com/share/link?shareid=592995&uk=2953765628 (均是对多音字曾进行的修正)

    作者博客:http://www.cnblogs.com/Lefter

  • 相关阅读:
    Linux找回root密码
    关于Linux的随笔笔记
    需求征集系统进度03
    需求征集系统进度02
    需求征集系统进度01
    第六周总结
    阅读笔记03
    第一周总结
    第五周总结
    阅读笔记02
  • 原文地址:https://www.cnblogs.com/Lefter/p/3102727.html
Copyright © 2011-2022 走看看