Wie entferne ich diakritische Zeichen aus einem String in Swift?

73

Wie entferne Stringich in Swift diakritische Zeichen (oder Akzente) aus einem (wie zum Beispiel "één" in "een" ändern)? Muss ich zurück zu NSStringoder kann es in Swift gemacht werden?

Johan Kool
quelle

Antworten:

160

Sie können direkt mit einem Swift arbeiten String(wenn "Foundation" importiert wird):

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
Martin R.
quelle
Schöne Lösung! Vielen Dank.
Johan Kool
Hervorragende Antwort wie immer. Beachten Sie, dass stringByFoldingWithOptions eine Methode von NSString ist. Dies nutzt die nahtlose Überbrückung zwischen NSString und String in Swift 2. In Swift 3 sieht es anders aus.
Duncan C
1
@ codddeer123: Sieht ähnlich aus wie in stackoverflow.com/a/16837527/1187415 : U-0141 LATEINISCHER GROSSBUCHSTABE L MIT SCHLAG hat keine Zerlegung in ein Basiszeichen und eine Kombinationsmarke. Oder (so wie ich es verstehe) der Unicode-Standard definiert keine Beziehung zwischen Łund L.
Martin R
@ MartinR, danke für die schnelle Antwort. Also im Falle von Ł sollte ich es manuell entfernen?
mikro098
2
@RanLearns: Ich gehe davon aus, dass locale: nildie allgemeinen Unicode-Regeln und locale: .currentdie der aktuellen Sprachen angewendet werden . Aber ich habe es nicht getestet.
Martin R
18

Update auf die Antwort von @ MartinR… eine Swift 3- Erweiterung, um eine Zeichenfolge zum Sortieren / Suchen bereitzustellen, die für jemanden nützlich sein könnte…

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

z.B

print("Mÿ nâMe ís jÄço´B".forSorting) // "mynameisjacob"
Ashley Mills
quelle
1
Sie sollten jetzt wissen, dass das Sortieren sehr vom Gebietsschema abhängig ist. Zum Beispiel ist in meiner Sprache "ch" ein Buchstabe zwischen "h" "i". Verwenden Sie zum Sortieren, wenn Sie diakritisch unempfindlich sind, einfach die richtigen Suchoptionen für Zeichenfolgen.
Sulthan
4
Zum Sortieren sollten Sie verwenden localizedStandardCompare.
rmaddy
1

Antwort Update für Swift 5.0.1

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

und benutze es someTextField.text.toNoSmartQuotes()

wieder
quelle
3
Beachten Sie jedoch, dass die Änderung größer ist als Ihr Methodenname impliziert.
Johan Kool
0

Das ist meine Lösung

Swift 5

    extension String {

        func unaccent() -> String {

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

        }

    }
Danielvgftv
quelle