1

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

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

我的 iPhone 键盘: 在此处输入图像描述

4

2 回答 2

1

'Folding' 返回一个字符串,您可以将其与另一个字符串进行比较,并考虑一些功能。

如果您正在比较两个字符串,并且该比较是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")
}
于 2021-10-16T17:34:15.850 回答
1

这正好符合 的意思diacriticInsensitiveUTR #30涵盖了这一点。“变音符号删除”包括“笔画、钩子、下降”和所有其他返回“相关基本字符”的“变音符号”。虽然在瑞典语å中被认为是用于排序目的的单独字母,但它仍然具有 (Latin) 的“基本字符” 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 阿拉伯语键盘包括半字母“ء”。这并不是对字母表如何工作的声明。只是说 ء 在写阿拉伯语时有点常用。

于 2021-10-16T19:57:34.517 回答