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

时间:2012-04-09 22:20:11

标签: objective-c ios cocoa nsstring diacritics

对于与变音符号无关的全文搜索功能,我使用以下代码将重音字符(如éÖ)转换为小写的非重音形式e和{{1 }}

o

这很有效。但是,我发现无法转换基本形式由多个字符组成的特殊字符,如法语[[inputString stringByFoldingWithOptions: NSCaseInsensitiveSearch + NSDiacriticInsensitiveSearch + NSWidthInsensitiveSearch locale: [NSLocale currentLocale]] lowercaseString]; (如“sœur”)或德语œ(如“Fluß”)。我想将它们分别转换为ßoe。我没有找到stringByFoldingWithOptions的标志,也没有在网上找到任何东西。

修改

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

2 个答案:

答案 0 :(得分:6)

从最差到最佳解决方案。

解决方案1仅适用于æ和ß,并且其他所有内容都失败( - ij ff fi < / strong>, fl ffi ffl ft 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与手动更换字符串结合起来。

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

答案 1 :(得分:0)

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