NSSsortingng: moyen facile de supprimer les accents UTF-8 d’une chaîne?

Je veux changer une phrase, par exemple:

Être ou ne pas être C’était là-bas.

Deviendrait:

Etre ou ne pas etre. C’etait la-bas.

Y at-il un moyen facile de faire cela avec NSSsortingng? Ou dois-je le développer moi-même en vérifiant chaque caractère?

NSSsortingng *str = @"Être ou ne pas être. C'était là-bas."; NSData *data = [str dataUsingEncoding:NSASCIISsortingngEncoding allowLossyConversion:YES]; NSSsortingng *newStr = [[NSSsortingng alloc] initWithData:data encoding:NSASCIISsortingngEncoding]; NSLog(@"%@", newStr); 

… ou essayez d’utiliser NSUTF8SsortingngEncoding place.

Liste des types d’encodage ici:

https://developer.apple.com/documentation/foundation/nsssortingngencoding


Juste une FTR, voici une façon de rédiger cette excellente réponse:

 yourSsortingng = [[NSSsortingng alloc] initWithData: [yourSsortingng dataUsingEncoding:NSASCIISsortingngEncoding allowLossyConversion:YES] encoding:NSASCIISsortingngEncoding]; 

Mattt Thompson a couvert cela dans NSHipster et à nouveau à la session de WWDC 2013 228

TL; DR

 NSMutableSsortingng *str = [@"Être ou ne pas être. C'était là-bas." mutableCopy]; CFSsortingngTransform((__bridge CFMutableSsortingngRef)ssortingng, NULL, kCFSsortingngTransformSsortingpCombiningMarks, NO); 

Devrait faire le tour, ça a bien marché pour moi.

Mise en garde Étant donné que beaucoup de personnes dans les commentaires disent que cela devrait être la réponse acceptée, je voudrais faire une mise en garde concernant cette méthode. Cette méthode est assez lente et doit être utilisée avec précaution si de grandes quantités de chaînes / données doivent être transformées

As-tu essayé

 [ssortingng ssortingngByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale currentLocale]] 

ou

 Boolean CFSsortingngTransform ( CFMutableSsortingngRef ssortingng, CFRange *range, CFSsortingngRef transform, Boolean reverse ); 

?

Identificateurs CFSsortingngTransform & Transform

 NSMutableSsortingng *ssortingng = ...; CFMutableSsortingngRef ssortingngRef = (__bridge CFMutableSsortingngRef)ssortingng; CFSsortingngTransform(ssortingngRef, NULL, kCFSsortingngTransformToLatin, NO); NSLog(@"%@", ssortingng); 

Juste une mise à jour pour dire que cela peut être fait comme ça dans swift:

 "Être ou ne pas être. C'était là-bas.".ssortingngByFoldingWithOptions(NSSsortingngCompareOptions.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale()) 

-> “Etre ou ne pas etre. C’etait la-bas.”

Voici un test de performance utilisant Swift 2.0 sur iPhone 6 iOS 9.0 Simulator entre des solutions utilisant:

  • CFSsortingngTransform (Tâche 1)
  • ssortingngByFoldingWithOptions (Tâche 2)

La tâche 2 est toujours plus rapide, par exemple:

 Task 1 took 9.49736100435257 seconds. Task 2 took 1.96649599075317 seconds. 

Voici le test:

  let timer = ParkBenchTimer() for _ in 1...1000000 { let mSsortingngRef = NSMutableSsortingng(ssortingng: "Être ou ne pas être. C'était là-bas.") as CFMutableSsortingngRef CFSsortingngTransform(mSsortingngRef, nil, kCFSsortingngTransformSsortingpCombiningMarks, false) Ssortingng(mSsortingngRef) } print("Task 1 took \(timer.stop()) seconds.") let timer2 = ParkBenchTimer() for _ in 1...1000000 { "Être ou ne pas être. C'était là-bas.".ssortingngByFoldingWithOptions(NSSsortingngCompareOptions.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale()) } print("Task 2 took \(timer2.stop()) seconds.") 

ParkBenchTimer par Klaas: https://stackoverflow.com/a/26578191/1097106

voici le code complet. utilisez la fonction ssortingngbyfoldignWithOptions.

NSSsortingng *str1=@"Être ou ne pas être C'était là-bas"; NSSsortingng *str2=[str1 ssortingngByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale systemLocale]]; NSLog(@"%@",str2);

Swift 3 (testé dans la cour de récréation)

 //Ssortingng+SsortingpCombiningMarks.swift extension Ssortingng { /// ssortingp combining marks (accents or diacritics) var ssortingpCombiningMarks: Ssortingng { let mSsortingngRef = NSMutableSsortingng(ssortingng: self) as CFMutableSsortingng CFSsortingngTransform(mSsortingngRef, nil, kCFSsortingngTransformSsortingpCombiningMarks, false) return mSsortingngRef as Ssortingng } } 

Usage:

 let umlaut = "äöüÄÖÜ" //ÄÖÜ let ssortingpped = umlaut.ssortingpCombiningMarks //aouAOU 

Pour ceux qui veulent une version Swift de la solution CFSsortingngTransform:

 let ssortingpAccentAndDiacritics: (Ssortingng) -> Ssortingng = { var mSsortingngRef = NSMutableSsortingng(ssortingng: $0) as CFMutableSsortingngRef CFSsortingngTransform(mSsortingngRef, nil, kCFSsortingngTransformSsortingpCombiningMarks, Boolean(0)) return Ssortingng(mSsortingngRef) }