如何在 Swift 中删除字符串中的音调符号?

如何删除发音符号(或口音)从一个 String(如说改变“ én”到“ een”)在 Swift?我必须回到 NSString还是可以在斯威夫特内部完成?

28101 次浏览

You can operate directly on a Swift String (if "Foundation" is imported):

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

Swift 3:

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

Update to @MartinR's answer… a Swift 3 extension to provide a string for sorting / searching, that might be useful for someone…

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: "")
}
}

e.g.

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

Answer update for Swift 5.0.1

func toNoSmartQuotes() -> String {
let userInput: String = self
return userInput.folding(options: .diacriticInsensitive, locale: .current)
}

and use it someTextField.text.toNoSmartQuotes()

This is my solutión

Swift 5

    extension String {


func unaccent() -> String {


return self.folding(options: .diacriticInsensitive, locale: .current)


}


}

This can also be done applying a StringTransform:

let foo = "één"
let bar = foo.applyingTransform(.stripDiacritics, reverse: false)!
print(bar) // een

Or implementing a custom property to StringProtocol

extension StringProtocol {
var stripingDiacritics: String {
applyingTransform(.stripDiacritics, reverse: false)!
}
}

let bar = foo.stripingDiacritics
print(bar) // een