От худшего решения к лучшему.
Решение 1 будет работать только для æ и ß и не работает для всех остальных (œ, ij, ff, fi , fl, ffi, ffl, ſt, st, ...) :
NSString *result = [[[NSString alloc] initWithData:[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Решение 2 будет работать для большинства лигатур и не работает только для æ, œ и ij. Я перепробовал все возможные NSLocale, так что проблема не в этом:
NSString *result = [inputString stringByFoldingWithOptions:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch locale:[NSLocale currentLocale]];
Решение 3 будет работать для большинства лигатур и не работает только для œ:
NSString *result = [[[NSString alloc] initWithData:[[inputString precomposedStringWithCompatibilityMapping] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Это означает, что œ всегда нужно будет обрабатывать вручную. И лучшее решение - объединить решение 2 или 3 с ручной заменой строки.
Решение 2бис:
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]];
Решение 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];
Зная, что я могу пропустить некоторые замены с решением 2bis, а NSLocale непредсказуем, лучшим решением является 3bis. А также это последнее решение позволяет вам сохранять чувствительность к регистру, если вам нужно.
person
Cœur
schedule
15.01.2014
-decomposedStringWithCompatibilityMapping
делаю это для вас? - person joerick   schedule 10.04.2012-decomposedStringWithCompatibilityMapping
- person regular   schedule 10.04.2012ß
(преобразовывает вss
) - person regular   schedule 10.04.2012