[英]Is there a way to use NSString stringByFoldingWithOptions to unfold the single French 'œ' character into 'oe'?
對於與變音符號無關的全文搜索功能,我使用以下代碼將重音字符(如é
或Ö
)轉換為小寫非重音形式的e
和o
[[inputString stringByFoldingWithOptions:
NSCaseInsensitiveSearch
+ NSDiacriticInsensitiveSearch
+ NSWidthInsensitiveSearch
locale: [NSLocale currentLocale]] lowercaseString];
這行得通。 但是,我發現無法轉換基本形式由多個字符組成的特殊字符,例如法語œ
(如“sœur”)或德語ß
(如“Fluß”)。 我想將它們分別轉換為oe
和ss
。 我沒有找到 stringByFoldingWithOptions 的標志,也沒有在 web 上找到任何東西。
編輯
ß
實際上是由上面的代碼正確處理的。 它轉換為ss
。
從最壞到最好的解決方案。
解決方案 1 僅適用於 æ 和 ß,對其他所有內容均無效( œ 、 ij 、 ff 、 fi 、 fl 、 ffi 、 ffl 、 ſt 、 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 與手動字符串替換結合起來。
解決方案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 。 最后一個解決方案還允許您在需要時保持區分大小寫。
查看CFStringTransform()
及其kCFStringTransformToLatin
選項。 我認為這可能會做你正在尋找的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.