gpt4 book ai didi

unicode - 使用 (Core)Foundation 折叠/规范化连字(例如 Æ 到 ae)

转载 作者:行者123 更新时间:2023-12-03 13:32:23 28 4
gpt4 key购买 nike

我正在编写一个对输入字符串执行许多转换的助手,以便创建该字符串的搜索友好表示。

考虑以下场景:

  • 德语或法语文本全文搜索
  • 数据存储中的条目包含
  • Müller
  • Großmann
  • Çingletòn
  • Bjørk
  • Æreogramme
  • 搜索应该是模糊的,因为
  • ull , Üll等匹配Müller
  • Gros , groß等匹配Großmann
  • cin等匹配Çingletòn
  • bjö , bjo等匹配Bjørk
  • aereo等匹配Æreogramme

  • 到目前为止,我已经在案例 (1)、(3) 和 (4) 中取得了成功。

    我无法弄清楚的是如何处理(2)和(5)。

    到目前为止,我已经尝试了以下方法无济于事:
    CFStringNormalize() // with all documented normalization forms
    CFStringTransform() // using the kCFStringTransformToLatin, kCFStringTransformStripCombiningMarks, kCFStringTransformStripDiacritics
    CFStringFold() // using kCFCompareNonliteral, kCFCompareWidthInsensitive, kCFCompareLocalized in a number of combinations -- aside: how on earth do I normalize simply _composing_ already decomposed strings??? as soon as I pack that in, my formerly passing tests fail, as well...

    我浏览了 ICU User Guide for Transforms但没有在上面投入太多……我认为这是显而易见的原因。

    我知道我可以通过转换为大写然后再转换回小写来捕获案例 (2),这将在此特定应用程序的领域内工作。然而,我有兴趣在更基本的层面上解决这个问题,希望也允许区分大小写的应用程序。

    任何提示将不胜感激!

    最佳答案

    恭喜,您已经找到了文本处理中最痛苦的部分之一!

    首先,NamesList.txtCaseFolding.txt 是此类事情不可或缺的资源,如果您还没有见过的话。

    部分问题是您正在尝试做一些几乎正确的事情,适用于您关心的所有语言/区域设置,而 Unicode 更关心在以单一语言区域设置显示字符串时做正确的事情。

    对于 (2), ß 从我能找到的最早的 CaseFolding.txt ( 3.0-Update1/CaseFolding-2.txt ) 开始就规范地大小写折叠为 ssCFStringFold()-[NSString stringByFoldingWithOptions:] 应该做正确的事情,但如果不是,“与语言环境无关”的 s.upper().lower() 似乎可以为所有输入提供合理的答案(并且还处理臭名昭著的“土耳其语 I”)。

    对于 (5),您有点不走运:Unicode 6.2 似乎不包含从 Æ 到 AE 的规范映射,并且已从“字母”更改为“连字”并再次返回(U+00C6 是 LATIN CAPITAL LETTER A E in 1.0、1.1 中的 LATIN CAPITAL LIGATURE AE 和 2.0 中的 LATIN CAPITAL LETTER AE)。您可以在 NamesList.txt 中搜索“连字”并添加一些特殊情况。

    笔记:

  • CFStringNormalize() 没有做你想做的事。您确实希望在将字符串添加到索引之前对其进行规范化;我建议在其他处理的开始和结束时使用 NFKC。
  • CFStringTransform() 也不是你想要的;所有脚本都是“拉丁语”
  • CFStringFold() 依赖于顺序:组合 ypogegrammeni and prosgegrammenikCFCompareDiacriticInsensitive 剥离,但被 kCFCompareCaseInsensitive 转换为小写 iota 。 “正确”的事情似乎是先进行大小写折叠,然后再进行其他操作,尽管从语言上剥离它可能更有意义。
  • 您几乎肯定不想使用 kCFCompareLocalized,除非您想在每次区域设置更改时重建搜索索引。

  • 其他语言的读者注意: 检查您使用的函数是 而不是 取决于用户的当前语言环境! Java 用户应该使用类似 s.toUpperCase(Locale.ENGLISH) 的东西,.NET 用户应该使用 s.ToUpperInvariant() 。如果您确实需要用户的当前语言环境,请明确指定。

    关于unicode - 使用 (Core)Foundation 折叠/规范化连字(例如 Æ 到 ae),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9376621/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com