Von der schlechtesten zur besten Lösung.
Lösung 1 werden nur für æ und ß arbeiten und nicht für alles andere (œ, ij, ff, fi, fl, ffi, ffl, ft , st, ...):
NSString *result = [[[NSString alloc] initWithData:[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Lösung 2 funktioniert für die meisten Ligaturen und schlägt nur für æ, - und ij fehl. Ich habe versucht, alle möglich NSLocale, es ist also nicht das Problem hier:
NSString *result = [inputString stringByFoldingWithOptions:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch locale:[NSLocale currentLocale]];
Lösung 3 für die meisten Ligaturen arbeiten und nicht nur für œ:
NSString *result = [[[NSString alloc] initWithData:[[inputString precomposedStringWithCompatibilityMapping] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Was bedeutet œ wird muss immer manuell gehandhabt werden. Die beste Lösung besteht darin, entweder Lösung 2 oder 3 mit einem manuellen String-Ersatz zu kombinieren.
Lösung 2bis:
inputString = [inputString stringByReplacingOccurrencesOfString:@"æ" withString:@"ae" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [inputString length])];
inputString = [inputString stringByReplacingOccurrencesOfString:@"œ" withString:@"oe" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [inputString length])];
inputString = [inputString stringByReplacingOccurrencesOfString:@"ij" withString:@"ij" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [inputString length])];
NSString *result = [inputString stringByFoldingWithOptions:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch locale:[NSLocale currentLocale]];
Lösung 3bis:
inputString = [inputString stringByReplacingOccurrencesOfString:@"Œ" withString:@"OE"];
inputString = [inputString stringByReplacingOccurrencesOfString:@"œ" withString:@"oe"];
NSString *result = [[[NSString alloc] initWithData:[[inputString precomposedStringWithCompatibilityMapping] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Zu wissen, ich könnte einige Ersatz mit Lösung 2bis fehlt und NSLocale ist unberechenbar, beste Lösung 3bis ist. Und auch diese letzte Lösung ermöglicht es Ihnen, die Groß-/Kleinschreibung bei Bedarf zu berücksichtigen.
mögliches Duplikat von [NSString - wie man von "ÁlgeBra" zu "Algebra" geht] (http://stackoverflow.com/questions/5050270/nsstring-how-to-go-from-lgebra-to-algebra) – Jack
Ich bin kein Experte, aber ich mache '-composedStringWithCompatibilityMapping' dies für Sie tun? – joerick
- zersetzt sich leider nicht. :( – Wevah