2012-03-28 63 views
7

我正在xcode4.3/Objective-C中构建应用程序,并在尝试对NSMutableArray进行排序时遇到了问题。我将用sqlite数据库中的字符串填充它。瑞典字符å,ä和ö出现问题。如何在字符串包含åäö时按字母顺序排列字符串数组?

的orded阵列应该是这个样子:如,BR,醇,ST,AR,OG,OS。

但是,当我使用选择比较的顺序是这样的:因为,AR,BR,醇,OG,操作系统,ST。

当我使用localizedCompare顺序变化:如,AR,BR,OG,醇,操作系统,ST。

根据旧的线程localizedCompare应该是解决方案,但我不能让它正常工作。如果我使用终端访问sqlite数据库并输入ORDER,我会得到正确的结果。我的问题可能与xcode或iphone模拟器中的某些设置有关,因为它们都不显示正确的顺序?或者是本地化比较错误的方式去?只要完成工作,我会很乐意接受任何解决方法。谢谢。

+0

你可以提供你所使用的这个代码? – David 2012-03-28 17:10:11

+0

我会检查'localizedStandardCompare:'是否有任何不同。否则,您可能需要实现自己的比较器(或者因为您提到了SQLite数据库......如果您使用的是核心数据,则可以让数据库通过在获取请求上设置排序描述符来进行排序)。 – rickster 2012-03-28 17:24:56

+0

本地化比较应该可以正常工作,但前提是您的区域设置(在您的机器中)设置为瑞典。我得到的奇怪的事情是,如果我登录数组的特殊字符的单词不打印,但显示为unicode代码。如果我记录了他们正确记录的单词并按照正确的顺序。 – rdelmar 2012-03-28 22:11:25

回答

13

你可以把它用compare:options:range:locale:并明确指定瑞典的语言环境,像这样的工作:

NSArray *strings=[NSArray arrayWithObjects:@"as", @"ol", @"st", @"br", @"ög", @"år", @"ös", nil]; 
NSLocale *locale=[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"]; 

NSArray *sorted=[strings sortedArrayUsingComparator:^(NSString *first, NSString *second) { 
    return [first compare:second 
        options:0 
        range:NSMakeRange(0, [first length]) 
        locale:locale]; 
}]; 

for (NSString *s in sorted) { NSLog(@"%@", s); } 

输出是:

2012-04-10 08:08:18.139 Untitled[32416:707] as 
2012-04-10 08:08:18.140 Untitled[32416:707] br 
2012-04-10 08:08:18.141 Untitled[32416:707] ol 
2012-04-10 08:08:18.142 Untitled[32416:707] st 
2012-04-10 08:08:18.142 Untitled[32416:707] år 
2012-04-10 08:08:18.143 Untitled[32416:707] ög 
2012-04-10 08:08:18.143 Untitled[32416:707] ös 
相关问题