有没有办法使用NSString stringByFoldingWithOptions将单个法语”’字符展开为’oe’?

对于与变音符号无关的全文搜索function,我使用以下代码将éÖ等重音字符转换为小写的非重音formseo

 [[inputString stringByFoldingWithOptions: NSCaseInsensitiveSearch + NSDiacriticInsensitiveSearch + NSWidthInsensitiveSearch locale: [NSLocale currentLocale]] lowercaseString]; 

这很有效。 但是,我发现无法转换基本forms由多个字符组成的特殊字符,如法语œ (如“sœur”)或德语ß (如’Fluß’)。 我想分别将它们转换为oess 。 我没有找到stringByFoldingWithOptions的标志,也没有在网上找到任何东西。

编辑

ß实际上是通过上面的代码正确处理的。 它转换为ss

从最差到最佳解决方案。

解决方案1仅适用于æ和ß,并且对其他所有内容都失败( œijfffiflffifflftst ,…):

 NSString *result = [[[NSString alloc] initWithData:[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease]; 

解决方案2适用于大多数连字,仅适用于æœfails 。 我已经尝试了所有可能的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与手动字符串替换相结合。

解决方案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]]; 

解决方案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 。 此最后一个解决方案允许您在需要时保持区分大小写。

看一下CFStringTransform()及其kCFStringTransformToLatin选项。 我认为这可能会做你想要的。