首页 > 解决方案 > 使用 macOS API 识别所有可能使用变音符号的 unicode 字符

问题描述

对于我正在使用的优化搜索功能,我需要识别 Unicode 字符串中可能被变音符号修改的任何字符。

例如,字符“a”、“U”、“e”和“n”可以使用变音形式,如“ä”、“Ü”、“é”、“è”和“ñ”。我怎样才能建立一个所有这些字符的列表?是静态的还是动态的?

实际上,我希望得到所有受字符串比较的“变音符号不敏感”选项影响的字符,就像它们[NSString stringByFoldingWithOptions:NSDiacriticInsensitiveSearch]被.[cd][d]NSPredicate

目标

我在 macOS 上针对本机应用程序执行此操作,因此我可以自由添加到我的应用程序的任何本机框架功能或 3rd 方库都可以。我还标记了 iOS,因为我非常希望 iOS 上可用的东西也能在 macOS 上运行。

背景与例子,对于那些需要了解的人

我需要这个以便能够在提供搜索功能的数据池中进行搜索,该搜索功能对变音符号敏感,并且包含预先组合的unicode 字符。

考虑这个数据集(不,它不是一个通用数据库,所以忘记那个方向的建议):

我只能通过一个一个地获取每个条目来查询这个数据库,并且可以选择基于不区分大小写、不区分规范化但区分变音符号的子字符串比较来预过滤返回的项目。

现在,我想通过不区分变音符号的查找来查找包含子字符串“Frau”的所有条目,即我想在数据集中同时找到“Frau”和“Fräulein”。

最简单的方法是查询数据集中的每个条目(即没有过滤器),然后使用提供变音符号不敏感查找的 macOS 字符串函数执行比较。我什至可以通过预折叠搜索字符串和预折叠每个查询项目来加快比较循环。但这微不足道。我只是想解释一下,我知道我在这里做什么。

查询操作相当昂贵(想想返回结果的网络连接,即慢速网络是瓶颈)。出于这个原因,它需要返回的项目越少,即我使用所述过滤器预先选择的结果越好,我得到的性能就越好。这就是这个问题的原因。

为了完成这项工作,我过滤了“Fr”(或“fr”,因为过滤器不区分大小写)。这会给我这些结果:

然后我可以在这些项目之上执行我之前提到的自己的比较,以找到我正在寻找的那些。

因此,通过预先过滤结果,我可以显着加快搜索速度。为了完成这项工作,我需要一种方法将搜索字符串减少为一组连续字符(最好是其中最长的字符),以便与数据集的过滤器功能一起使用,确保不会导致它从结果中删除项目只是因为它使用了与预期不同的变音符号。

标签: iosswiftmacosunicodensstring

解决方案


推荐阅读