如何将土耳其语中的“i”转换为大写?

3
在土耳其语中,有两个i:
1.无点:ı,I
2.有点:i,İ
问题:每次大写一个i时,都会得到一个I。
解决方案:当我大写一个i时,只想得到一个İ(仅限土耳其语),并且在我大写一个ı时想得到一个I。
我有一个函数可以实现这个目的。
@objc public static func uppercaseTurkishString(_ string: String) -> String {
    return String(string.map { (char) -> Character in
        if char == "i" {
            return "İ"
        } else {
            return Character(String(char).uppercased())
        }
    })
}

但每次使用它时我都必须检查语言是否为土耳其语,对于应用程序中的每个字符串都这样做是一项非常困难的工作。

有没有更简单的方法?


2
如果你执行 let turckishI = "Dotless: ı, I Dotted: i, İ",然后调用 turckishI.localizedLowercase,你会发现渲染出来的小写字母 i(最后一个)与你的不同。但是也有本地化的大写形式。 - Larme
2个回答

7
问题在于uppercased()函数不考虑Locale,并且小点的i看起来像正常的英文i。您应该使用localizedUppercase,它将为土耳其用户使用土耳其Locale(或uppercased(with: Locale(identifier: "tr_TR"),如果您希望对您的应用程序的所有用户执行此操作而不考虑他们的语言环境设置,但我不建议这样做)。
此外,没有必要逐个字符地进行大写处理,您可以直接对整个String进行处理。
@objc public static func uppercaseTurkishString(_ string: String) -> String {
    return string.localizedUppercase
}

1
Foundation的开发者已经考虑到这一点,这也正是为什么有uppercased(with: Locale?)方法的原因:
"i".uppercased(with: Locale(identifier: "tr_TR")) // returns "İ"
"i".uppercased(with: Locale(identifier: "en_US")) // returns "I"
"ı".uppercased(with: Locale(identifier: "tr_TR")) // returns "I"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接