2012-03-28 15 views
7

私はxcode4.3/Objective-Cでアプリケーションを構築しており、NSMutableArrayをソートしようとすると問題が発生しています。私はsqliteデータベースから文字列を入力します。この問題はスウェーデン文字å、äおよびöで発生します。文字列にåäöが含まれている場合、どのようにアルファベット順に文字列を並べ替えることができますか?

orded配列は、as、br、ol、st、år、ög、ösのようになります。

しかし、セレクタを使用すると、次のようになります。as、år、br、ol、ög、ös、st。

私がlocalizedCompareを使用すると、次のように変更されます:as、år、br、ög、ol、ös、st。

古いスレッドによれば、localizedCompareは解決策になるはずですが、正しく動作させることはできません。ターミナルを使用してsqliteデータベースにアクセスし、ORDERと入力すると正しい結果が得られます。どちらも正しい順序を表示していないので、私の問題はxcodeやiphoneシミュレータのいくつかの設定に関連していますか?または、ローカライズされている間違った方法を比較しますか?仕事を終わらせる限り、私は喜んでどんな回避策も受け入れます。ありがとう。

+0

は、あなたがこれを行うために使用するコードを提供することができますか? – David

+0

'localizedStandardCompare:'が異なっているかどうかを確認したいと思います。それに失敗した場合は、独自のコンパレータを実装する必要があります(または、SQLite DBについて言及しています。コアデータを使用している場合、フェッチ要求でソート記述子を設定してDBにソートを実行させることができます)。 – rickster

+0

ローカライズされた比較が動作するはずですが、あなたのロケール(あなたのマシン内)がスウェーデンに設定されている場合に限ります。私が得意なのは、特殊文字を含む単語が印刷されずにユニコードコードとして表示されるということです。私が個々の言葉を記録すると、彼らは正しい順序で正確に記録されます。 – rdelmar

答えて

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 
関連する問題