How to remove diacritics from a String in Swift?

SwiftString

Swift Problem Overview


How to remove diacritics (or accents) from a String (like say change "één" to "een") in Swift? Do I have to go back to NSString or can it be done within Swift?

Swift Solutions


Solution 1 - Swift

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

Solution 2 - Swift

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"

Solution 3 - Swift

This is my solutión

Swift 5

    extension String {

        func unaccent() -> String {

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

        }

    }

Solution 4 - Swift

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

Solution 5 - Swift

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()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohan KoolView Question on Stackoverflow
Solution 1 - SwiftMartin RView Answer on Stackoverflow
Solution 2 - SwiftAshley MillsView Answer on Stackoverflow
Solution 3 - SwiftDanielvgftvView Answer on Stackoverflow
Solution 4 - SwiftLeo DabusView Answer on Stackoverflow
Solution 5 - SwiftamagainView Answer on Stackoverflow