swift 字符串 diacriticInsensitive 不正确

swift string diacriticInsensitive not working correct

我正在对字符串进行变音符号转换。在瑞典语中,它将字母 åäö 转换为 aao。但是 iphone 键盘有 åäö 这些字母。我不明白为什么要转换这 3 个字母。我的代码有错误吗?键盘上的字母不应该转换吗?

print("åäö".folding(options: .diacriticInsensitive, locale: Locale(identifier: "sv"))) -> output aao

我的 iphone 键盘:

'Folding' returns 一个字符串,您可以将其与另一个字符串进行比较,同时考虑一些特征。

如果您正在比较两个字符串,并且该比较是 diacriticInsensitive 忽略变音符号,例如“ö”中的变音符号,这样它将把“ö”和“o”视为相同的字符。

我不清楚你为什么要提到你的键盘。键盘与字符串内容无关

这是您的代码,通过比较上面两个字符串的调用进行扩展,忽略变音符

import Foundation

print("åäö".folding(options: .diacriticInsensitive, locale: Locale(identifier: "sv")))
print("aao".folding(options: .diacriticInsensitive, locale: Locale(identifier: "sv")))

if "åäö".compare("aao", options: .diacriticInsensitive, range: nil, locale: nil) == .orderedSame {
    print("They Match (ignoring diacritics)")
} else {
    print("As different as night and day")
}

这正好符合diacriticInsensitive的意思。 UTR #30 涵盖了这一点。 “变音符号去除”包括“笔画、钩子、下降”和所有其他返回“相关基本字符”的“变音符号”。虽然在瑞典语中 å 被视为用于排序目的的单独字母,但它仍然具有(拉丁语)a 的“基本字符”。 (与 ä 和 ö 类似。)这是瑞典语中的一个复杂问题,但结果应该不足为奇。

最终规则在 Unicode 的 DiacriticFolding 中。这些规则不是特定于区域设置的。 Foundation 可能会应用一些额外的语言环境规则,但在这种情况下显然不是。相关的Unicode折叠规则是:

0061 030A;  0061    # å → a LATIN SMALL LETTER A, COMBINING RING ABOVE → LATIN SMALL LETTER A

许多文化对什么是“字母”、“另一个字母的扩展”、“半字母”和“非字母符号”都有微妙的定义。计算变音符号时,土耳其语“İ”的基本形式为“I”,但“i”没有基本形式“ı”。这很奇怪,但确实如此,因为它将“基本拉丁语”视为基本字母表。 (“基本拉丁语”本身就是一个奇怪的分类,字母 j、u 和 w 有点现代。但我们仍然称它为“拉丁语”。)

Unicode 试图在这些复杂问题上“穿针引线”,并取得了不同程度的成功。它倾向于偏向罗曼语系(尤其是西欧国家)。但它确实尝试了。它关注用户的期望。因此,搜索“halla”应该找到“Hallå”。我打赌大多数瑞典人会认为“足够接近”。

键盘的设计目的是为了对它们所针对的文化有用,因此不应假设某个特定符号是否出现在键盘上就对字母表的工作方式提出了任何强烈的主张。 iOS 阿拉伯语键盘包含半字母“Ç”。这并不是对字母表的工作原理做出声明。只是说在写阿拉伯语的时候,Ç有点常用。