reg*_*lar 3 cocoa objective-c diacritics nsstring ios
对于变音符号无关的全文搜索功能,我用下面的代码重音符号的字符转换像é或者Ö到他们的小写非重音形式e和o
[[inputString stringByFoldingWithOptions:
NSCaseInsensitiveSearch
+ NSDiacriticInsensitiveSearch
+ NSWidthInsensitiveSearch
locale: [NSLocale currentLocale]] lowercaseString];
Run Code Online (Sandbox Code Playgroud)
这有效.但是,我发现无法转换基本形式由多个字符组成的特殊字符,如法语œ(如"sœur")或德语ß(如"Fluß").我想分别将它们转换成oe和ss.我没有找到stringByFoldingWithOptions的标志,也没有在网上找到任何东西.
编辑
ß实际上是由上面的代码正确处理.它转换为ss.
从最差到最佳解决方案.
解决方案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.此外,最后一个解决方案允许您在需要时保持区分大小写.
| 归档时间: |
|
| 查看次数: |
1352 次 |
| 最近记录: |