2013年3月11日星期一

Android JB icu 汉字排序结果异常






问题

在 Android 4.1,系统语言设置为中文,当使用如下 SQL 语句查询 SQLite 数据库时,排序结果与之前的 Android 版本不同。

SELECT file_path FROM table ORDER BY file_path COLLATE LOCALIZED

以上语句对查询结果进行了排序,并且排序是按照本地化的规则,就是说不仅对 ASCII 字符排序,也会考虑到汉字的排序规则。旧版的 Android 都是遵循英文在前面,中文排在后面的规则,但 4.1 中却是中文排在英文前面。


原因

LOCALIZED 字符比较使用的是 icu 的多语言支持库,代码位于 Android 源码目录下的 external/icu4c 目录。经过一番研究后发现是 Android 4.1 把排序规则更改了(使用 icu 原始数据包排序正常),新增了两条汉字排序规则使汉字排在前面,规则文件位于 external/icu4c/data/coll/zh.txt

" [reorder Hani]"
" [reorder Hani Bopo]"

修改方法

把 external/icu4c/data/coll/zh.txt 中新增那两句话去掉,重新生成 icudt48l-default.dat 数据文件,步骤说明在 external/icu4c/stubdata/readme.txt

具体步骤:首先设置 ANDROID_BUILD_TOP 环境变量为你 Android 源码目录,然后运行 icu_dat_generator.py 就会生成新的数据文件 icudt48l-default.dat。把新的文件 push 到 /system/usr/icu/icudt48l.dat,重启即可看到效果。



没有评论:

发表评论