如何删除发音符号(或口音)从一个 String(如说改变“ én”到“ een”)在 Swift?我必须回到 NSString还是可以在斯威夫特内部完成?
String
NSString
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
Swift 5.0.1
func toNoSmartQuotes() -> String { let userInput: String = self return userInput.folding(options: .diacriticInsensitive, locale: .current) }
and use it someTextField.text.toNoSmartQuotes()
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:
StringTransform
let foo = "één" let bar = foo.applyingTransform(.stripDiacritics, reverse: false)! print(bar) // een
Or implementing a custom property to StringProtocol
StringProtocol
extension StringProtocol { var stripingDiacritics: String { applyingTransform(.stripDiacritics, reverse: false)! } }
let bar = foo.stripingDiacritics print(bar) // een