有没有办法使用NSString stringByFoldingWithOptions将单个法语”’字符展开为’oe’?
对于与变音符号无关的全文搜索function,我使用以下代码将é
或Ö
等重音字符转换为小写的非重音formse
和o
[[inputString stringByFoldingWithOptions: NSCaseInsensitiveSearch + NSDiacriticInsensitiveSearch + NSWidthInsensitiveSearch locale: [NSLocale currentLocale]] lowercaseString];
这很有效。 但是,我发现无法转换基本forms由多个字符组成的特殊字符,如法语œ
(如“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];
解决方案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
选项。 我认为这可能会做你想要的。
- 如何使用Interface Builder设置UIScreenEdgePanGestureRecognizer?
- 如何在ios中播放video播放器
- 为什么当我从一个视图控制器返回时,我的UITableView的格式完全错误?
- 数据未更新的NSFetchedResultsController
- AVPlayerLayer获取图像到UIImageView缓冲区
- iOS – 合并两个不同大小的图像
- select不是可以重命名的typesXcode 7
- UIRefreshControl:刷新时UITableView“卡住”
- 如何使用IBOutletCollection将多个UIImageView连接到同一个sockets?