gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:12:21 27 4
gpt4 key购买 nike

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

[[inputString stringByFoldingWithOptions: 
NSCaseInsensitiveSearch
+ NSDiacriticInsensitiveSearch
+ NSWidthInsensitiveSearch
locale: [NSLocale currentLocale]] lowercaseString];

这行得通。但是,我发现无法转换基本形式由多个字符组成的特殊字符,例如法语 œ(如“sœur”)或德语 ß(如 '流感”)。我想将它们分别转换为 oess 。我没有找到 stringByFoldingWithOptions 的标志,也没有在网上找到任何东西。

编辑

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

最佳答案

从最坏到最好的解决方案。

解决方案 1 仅适用于 æ 和 ß,对其他所有情况均无效/strong>, fl, , , , , . ..):

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 与手动字符串替换相结合。

解决方案 2 之二:

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]];

解决方案 3 之二:

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

关于objective-c - 有没有办法使用 NSString stringByFoldingWithOptions 将单个法语字符 'œ' 展开为 'oe' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com