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