如何从Swift中的String中删除变音符号?

Joh*_*ool 61 swift

如何从StringSwift中删除变音符(或重音符号)(比如说改变"één"到"een")?我是否必须回到NSString或者可以在Swift中完成?

Mar*_*n R 135

您可以直接在Swift上操作String(如果导入了"Foundation"):

let foo = "één"
let bar = foo.stringByFoldingWithOptions(.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale())
print(bar) // een
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

let foo = "één"
let bar = foo.folding(options: .diacriticInsensitive, locale: .current)
print(bar) // een
Run Code Online (Sandbox Code Playgroud)

  • @codddeer123:看起来与 /sf/answers/1178626921/ 中的情况类似:U-0141 带有笔画的拉丁文大写字母 L 没有分解为基本字符和组合标记。或者(据我所知)Unicode 标准没有定义 `Ł` 和 `L` 之间的关系。 (2认同)
  • @RanLearns:我假设* locale:nil将应用通用的Unicode规则,而locale:.current将使用当前语言的规则。但是我还没有测试。 (2认同)

Ash*_*lls 13

更新到@ MartinR的答案......一个Swift 3扩展,提供用于排序/搜索的字符串,这可能对某些人有用...

extension String {
    var forSorting: String {
        let simple = folding(options: [.diacriticInsensitive, .widthInsensitive, .caseInsensitive], locale: nil)
        let nonAlphaNumeric = CharacterSet.alphanumerics.inverted
        return simple.components(separatedBy: nonAlphaNumeric).joined(separator: "")
    }
}
Run Code Online (Sandbox Code Playgroud)

例如

print("Mÿ nâMe ís jÄço´B".forSorting) // "mynameisjacob"
Run Code Online (Sandbox Code Playgroud)

  • 对于排序,你应该使用`localizedStandardCompare`. (4认同)

小智 12

这是我的解决方案\xc3\xb3n

\n

雨燕5

\n
    extension String {\n\n        func unaccent() -> String {\n\n            return self.folding(options: .diacriticInsensitive, locale: .current)\n\n        }\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n


Leo*_*bus 10

这也可以通过应用StringTransform

\n
let foo = "\xc3\xa9\xc3\xa9n"\nlet bar = foo.applyingTransform(.stripDiacritics, reverse: false)!\nprint(bar) // een\n
Run Code Online (Sandbox Code Playgroud)\n
\n

或者实现自定义属性StringProtocol

\n
extension StringProtocol {\n    var strippingDiacritics: String {\n        applyingTransform(.stripDiacritics, reverse: false)!\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n
let bar = foo.strippingDiacritics\nprint(bar) // een\n
Run Code Online (Sandbox Code Playgroud)\n