4

我正在使用 Phonegap 为 iOS 做一个字典应用程序。

在查询数据库以获取按字母顺序排列的列表时,我使用COLLATE NOCASE

ORDER BY term COLLATE NOCASE ASC

这解决了以小写字母开头的术语附加到末尾的问题(从那个问题中提取)。

然而,像öäüéêè这样的非标准字符最终仍然会被排序~这里有2个例子:

    Expected: Öffnungszeiten     Oberved: Zuzahlung
              Zuzahlung                   Öffnungszeiten

(or)          clé                         cliquer sur
              cliquer sur                 clé

我环顾四周,发现此处此处讨论的类似问题,但似乎一般建议是安装某种类型的扩展

此扩展程序可能可以帮助您...

...使用 ICU 作为扩展

SQLite 支持与 ICU 集成...

但是我不确定这是否适用于我的数据库不是由我自己托管而是在客户设备上运行的情况。所以我想我会用我的应用程序包来发布这个扩展。
我对 iOS 不是很熟悉,但我感觉这会很复杂——至少。

同样在官方论坛中,我发现了这个提示:

SQLite does not properly handle accented characters.

并且在文字的后面一点,海报提到了 SQLite 中的一个错误。

我发现的所有链接都没有活跃 >= 1 年,而且似乎都没有处理我目前正在开发的移动环境。
所以我想知道是否还有其他人在他们的 iOS 项目上找到了解决方案。

文档指出它们只有 3 个默认的 COLLATION 选项:

6.0 整理序列

当 SQLite 比较两个字符串时,它使用排序序列或排序函数(两个词表示同一事物)来确定哪个字符串更大或两个字符串是否相等。SQLite 具有三个内置的整理函数:BINARY、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 中进行排序,但我怀疑这对整体性能没有任何好处。

4

1 回答 1

2

原因是 iOS 上的 SQLite 没有启用 ICU(Unicode 国际组件)。所以你需要构建你自己的启用 ICU 的 SQLite 版本+ 你自己的 ICU 版本作为静态库 + 添加 ICU .dat 并使 SQLite 加载这个 .dat 文件。然后您可以通过一个简单的 SQL 命令加载任何排序规则(即 'icu_load_collat​​ion("de_DE", "DEUTSCH")',在数据库打开后一次)

这不仅听起来像是肮脏的工作,而且确实如此。尝试找到所有已经完成的 SQLite + ICU 版本。

于 2013-09-25T00:00:26.540 回答