如何从Swift字符串中删除变音符号(或重音符号),例如将“één”更改为“een”?我必须返回到NSString
,还是可以在Swift内部完成?
String
(如果导入“Foundation”):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
更新@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: "")
}
}
print("Mÿ nâMe ís jÄço´B".forSorting) // "mynameisjacob"
localizedStandardCompare
。 - rmaddy这是我的解决方案
Swift 5
extension String {
func unaccent() -> String {
return self.folding(options: .diacriticInsensitive, locale: .current)
}
}
StringTransform
来完成:let foo = "één"
let bar = foo.applyingTransform(.stripDiacritics, reverse: false)!
print(bar) // een
或者实现一个自定义属性到 StringProtocol
中
extension StringProtocol {
var stripingDiacritics: String {
applyingTransform(.stripDiacritics, reverse: false)!
}
}
let bar = foo.stripingDiacritics
print(bar) // een
针对Swift 5.0.1
的答案更新
func toNoSmartQuotes() -> String {
let userInput: String = self
return userInput.folding(options: .diacriticInsensitive, locale: .current)
}
并使用它 someTextField.text.toNoSmartQuotes()
Ł
和L
之间的关系。 - Martin Rlocale: nil
将应用通用的 Unicode 规则,而locale: .current
则应用当前语言的规则。但我还没有测试过。 - Martin R