我正在用Phonegap做一个iOS版的字典应用程序。
在查询数据库中的字母列表时,我使用COLLATE NOCASE
:
ORDER BY term COLLATE NOCASE ASC
这解决了以小写字母开头的术语附加到末尾的问题(从that question中选取)。
然而,非标准字符,如öäüéêè,仍然会在最后排序~这里有2个例子:
Expected: Öffnungszeiten Oberved: Zuzahlung
Zuzahlung Öffnungszeiten
(or) clé cliquer sur
cliquer sur clé
我环顾四周,发现类似的问题讨论here或here,但似乎一般的建议是安装某种类型的扩展
此扩展可能会帮助您...
...将ICU用作分机
SQLite支持与ICU集成...
但我不确定这是否适用于我的情况,数据库不是由我自己托管的,而是在客户的设备上运行的,所以我想我会把这个扩展包和我的应用程序包一起发货。
我不太熟悉iOS,但我有一种感觉,那将是复杂的-至少。
同样在the official forum中,我发现了这个提示:
SQLite does not properly handle accented characters.
在正文的下面,海报提到了SQLite中的一个bug。
我发现所有的链接都已经超过1年没有活动了,而且没有一个链接可以处理我目前正在开发的移动环境。
所以我想知道是否还有人在他们的iOS项目上找到了解决方案。
文档指出它们只有3个默认的COLLATION选项:
6.0校对顺序
当SQLite比较两个字符串时,它使用排序序列或排序函数(两个单词表示同一个东西)来确定哪个字符串更大或两个字符串是否相等。SQLite有三个内置排序函数:二进制、NOCASE和RTRIM。
BINARY - Compares string data using memcmp(), regardless of text encoding.
NOCASE - The same as binary, except the 26 upper case characters of ASCII are folded to their lower case equivalents before the
执行比较。请注意,只有ASCII字符是大小写折叠的。由于所需表的大小,SQLite不会尝试进行完整的UTF大小写折叠。RTRIM-与二进制相同,只是尾部空格字符被忽略。
目前,我最好的猜测是在JavaScript中进行排序,但我怀疑这对整体性能没有什么好处。
1条答案
按热度按时间j5fpnvbx1#
原因是iOS上的SQLite没有ICU(Unicode的国际组件)。因此,您需要构建自己的启用ICU的SQLite版本+自己的ICU版本作为静态库+添加ICU.dat并使SQLite加载此.dat文件。然后,您可以通过简单的SQL命令加载任何排序规则(即“icu_load_collation(“de_DE”,“多伊奇”)“,数据库打开后一次)
这不仅听起来像是一项肮脏的工作,它确实是。尝试找到一个版本的SQLite + ICU与所有这一切都已经完成。