对于与变音符号无关的全文搜索功能,我使用以下代码将重音字符(如é
或Ö
)转换为小写的非重音形式e
和{{1 }}
o
这很有效。但是,我发现无法转换基本形式由多个字符组成的特殊字符,如法语[[inputString stringByFoldingWithOptions:
NSCaseInsensitiveSearch
+ NSDiacriticInsensitiveSearch
+ NSWidthInsensitiveSearch
locale: [NSLocale currentLocale]] lowercaseString];
(如“sœur”)或德语œ
(如“Fluß”)。我想将它们分别转换为ß
和oe
。我没有找到stringByFoldingWithOptions的标志,也没有在网上找到任何东西。
修改
ss
实际上是由上面的代码正确处理的。它会转换为ß
。
答案 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
选项。我认为这可能会做你想要的。