簡體   English   中英

有沒有一種方法可以使用 NSString stringByFoldingWithOptions 將單個法語“-”字符展開為“oe”?

[英]Is there a way to use NSString stringByFoldingWithOptions to unfold the single French 'œ' character into 'oe'?

對於與變音符號無關的全文搜索功能,我使用以下代碼將重音字符(如éÖ )轉換為小寫非重音形式的eo

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

這行得通。 但是,我發現無法轉換基本形式由多個字符組成的特殊字符,例如法語œ (如“sœur”)或德語ß (如“Fluß”)。 我想將它們分別轉換為oess 我沒有找到 stringByFoldingWithOptions 的標志,也沒有在 web 上找到任何東西。

編輯

ß實際上是由上面的代碼正確處理的。 它轉換為ss

從最壞到最好的解決方案。

解決方案 1 僅適用於 æ 和 ß,對其他所有內容均無效( œijfffifl 、...):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM