Android汉字转拼音核心代码解读

来源:互联网 发布:软装饰品知乎 编辑:程序博客网 时间:2024/04/28 02:28

原理:

找两个数组,一个用来存储所有相同汉字拼音的第一个汉字的Unicode编码,另一个用来存储对应的拼音。
注:可不是说按照Unicode编码大小来排序的。而是按照我们汉字的A,B,C,D,E,F,G这样的拼音发音的顺序,最后几个是仓颉字
大家可以看下,由于太长就简单复制一段吧。好心里有数。
public static final char[] UNIHANS = {
            '\u963f', '\u54ce', '\u5b89', '\u80ae', '\u51f9', '\u516b',

public static final byte[][] PINYINS = {
            { 65,   0,   0,   0,   0,   0}, { 65,  73,   0,   0,   0,   0},

核心代码:

      if (offset < 0) {            int begin = 0;            int end = UNIHANS.length - 1;            while (begin <= end) {                offset = (begin + end) / 2;                final String unihan = Character.toString(UNIHANS[offset]);                cmp = COLLATOR.compare(letter, unihan);                if (cmp == 0) {                    break;                } else if (cmp > 0) {                    begin = offset + 1;                } else {                    end = offset - 1;                }            }        }

UNIHANS是汉字数组,第一个是\u963F,最后一个是\u9FFF,然后从中间开始对比,
Collator COLLATOR = Collator.getInstance(Locale.CHINA)
这个是汉字比大小类,然后开始对比下我们汉字大概的位置。相等的时候匹配成功,打了就偏移++,小了就偏移--
最后再找下拼音数组,然后返回拼音。
这里让我不明白的地方就是为什么不按照Unicode的顺序,从大到小,建立一个Unicode数组,里面存储的还是第一个发生拼音变化的Unicode,再用一个char数组存储对应的拼音,这样匹配的时候我们可以直接转码Unicode比大小,也不用谷歌的这个Collator排序,据说谷歌的这个Collator有问题。
0 0