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

reg*_*lar 3 cocoa objective-c diacritics nsstring ios

对于变音符号无关的全文搜索功能,我用下面的代码重音符号的字符转换像é或者Ö到他们的小写非重音形式eo

[[inputString stringByFoldingWithOptions: 
    NSCaseInsensitiveSearch
    + NSDiacriticInsensitiveSearch
    + NSWidthInsensitiveSearch
locale: [NSLocale currentLocale]] lowercaseString];
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

Cœu*_*œur 6

从最差到最佳解决方案.

解决方案1仅适用于æ和ß,并且其他所有内容都失败(œ,ij,ff,fi,fl,ffi,ffl,ft,st,...):

NSString *result = [[[NSString alloc] initWithData:[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Run Code Online (Sandbox Code Playgroud)

解决方案2适用于大多数连字,仅适用于æ,œfails.我已经尝试了所有可能的NSLocale,所以这不是问题所在:

NSString *result = [inputString stringByFoldingWithOptions:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch locale:[NSLocale currentLocale]];
Run Code Online (Sandbox Code Playgroud)

解决方案3适用于大多数连字,只有œ:

NSString *result = [[[NSString alloc] initWithData:[[inputString precomposedStringWithCompatibilityMapping] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
Run Code Online (Sandbox Code Playgroud)

这意味着 - 总是需要手动处理.最好的解决方案是将解决方案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:@"?" withString:@"ij" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [inputString length])];
NSString *result = [inputString stringByFoldingWithOptions:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch locale:[NSLocale currentLocale]];
Run Code Online (Sandbox Code Playgroud)

解决方案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];
Run Code Online (Sandbox Code Playgroud)

知道我可能会错过解决方案2bis和NSLocale的一些替代品是不可预测的,最好的解决方案是3bis.此外,最后一个解决方案允许您在需要时保持区分大小写.

  • 我认为这个解决方案最好的部分是提出它的用户在他们的名字中使用了有问题的角色. (2认同)