UITableView的节头中的非US字符

epa*_*tel 13 iphone core-data special-characters uitableview

我添加了一个简单的Core Data iPhone应用程序的部分列表.

我按照这个问题来创建它 - 如何使用第一个字符作为节名,但我的列表中还包含以AZ以外的字符开头的项目,特别是在瑞典使用的Å,Ä和Ö.

现在的问题是,当表视图显示部分列表时,最后三个字符被绘制错误.见下图

看来我现在最好的选择是让这些物品在"Z"下排序

if ([letter isEqual:@"Å"] ||
    [letter isEqual:@"Ä"] ||
    [letter isEqual:@"Ö"]) 
    letter = @"Z";
Run Code Online (Sandbox Code Playgroud)

有人想过这个吗?

当我在它的时候......'Å','Ä'和'Ö'应按顺序排序,但由Core Data分类为'Ä','Å'和'Ö' NSSortDescriptor.我试图将选择器设置为localizedCaseInsensitiveCompare:但是会out of order section name 'Ä. Objects must be sorted by section name'出错.看到了吗?

Ste*_*ntz 15

所以我不能放弃这个,发现以下内容:

在这种情况下,您需要做的是"Unicode规范化表格D".在http://unicode.org/reports/tr15/中更详细解释(警告,长而干的文件)

这是一个执行分解然后过滤掉所有变音符号的函数.您可以使用它将Äpple转换为Apple,然后使用第一个字母构建索引.

- (NSString*) decomposeAndFilterString: (NSString*) string
{
    NSMutableString *decomposedString = [[string decomposedStringWithCanonicalMapping] mutableCopy];
    NSCharacterSet *nonBaseSet = [NSCharacterSet nonBaseCharacterSet];
    NSRange range = NSMakeRange([decomposedString length], 0);

    while (range.location > 0) {
        range = [decomposedString rangeOfCharacterFromSet:nonBaseSet
            options:NSBackwardsSearch range:NSMakeRange(0, range.location)];
        if (range.length == 0) {
            break;
        }
        [decomposedString deleteCharactersInRange:range];
    }

    return [decomposedString autorelease];
}
Run Code Online (Sandbox Code Playgroud)

(我在邮件列表上找到了这个代码,忘记了源代码,但是我把它拿了来修好了一点)

  • +1为研究和兴趣.但我想我现在已经把它排序了.我使用`localizedCaseInsensitiveCompare:`作为获取结果控制器的排序描述符,它将保持顺序作为设备上的语言设置.但是,索引标题等由CoreData处理,如此处所述的gerry3 http://stackoverflow.com/questions/1741093/how-to-use-the-first-character-as-a-section-name/1741131#1741131 (2认同)

Ste*_*ntz 3

当我遇到这样的情况时,我首先问自己的是“苹果做了什么”。

\n\n

作为一个实验,我刚刚将“Joe \xc3\x84pple”添加到我的 iPhone 地址簿中,他出现在普通的 A 下方。我认为这很有意义。

\n\n

因此,您应该这样做,而不是将它们扔到 Z 或 \xc3\x84 下。必须有某种方法来获取用于分组的 unicode 字符的“基本”字母。

\n