localizedCompare:
を使用して、NSFetchedResultsController
を使用して人名を返し、並べ替え順にUITableView
を入力しようとしています。 UI(各セクションの最初の文字の右の列)にセクションインデックスを提供しようとしています。 NSFetchedResultsController
には、各エンティティが属するべきセクション(具体的には、人物の名前の最初の文字、大文字)を提供するエンティティのセレクタが用意されています。NSString localizedCompare:長い文字列を指定した結果が一致しません
ユニコードコードポイントを使用する人名を扱うときは、問題が発生しました。 NSFetchedResultsController
は、エンティティがセクションでソートされていないと不平を言っています。
:
reason=The fetched object at index 103 has an out of order section name 'Ø. Objects must be sorted by section name'}, {
reason = "The fetched object at index 103 has an out of order section name '\U00d8. Objects must be sorted by section name'";
問題がlocalizedCompare:
によって返された比較値が先頭文字対全体の「単語」の異なることであるように思われます。
以下のテストはになりますが、( "Ø"と "O")と( "Østerhus"と "Osypowicz")の比較結果は一貫しています。
- (void)testLocalizedSortOrder300
{
NSString *str1 = @"Osowski";
NSString *str2 = @"Østerhus";
NSString *str3 = @"Osypowicz";
NSString *letter1 = @"O";
NSString *letter2 = @"Ø";
//localizedCompare:
//"Osowski" < "Østerhus"
NSComparisonResult res = [str1 localizedCompare:str2];
XCTAssertTrue(res == NSOrderedAscending, @"(localizedCompare:) Expected '%@' and '%@' to be NSOrderedAscending, but got %@", str1, str2, res == NSOrderedSame ? @"NSOrderedSame" : @"NSOrderedDescending");
//"Østerhus" < "Osypowicz"
res = [str2 localizedCompare:str3];
XCTAssertTrue(res == NSOrderedAscending, @"(localizedCompare:) Expected '%@' and '%@' to be NSOrderedAscending, but got %@", str2, str3, res == NSOrderedSame ? @"NSOrderedSame" : @"NSOrderedDescending");
//"O" < "Ø"
res = [letter1 localizedCompare:letter2];
XCTAssertTrue(res == NSOrderedAscending, @"(localizedCompare:) Expected '%@' and '%@' to be NSOrderedAscending, but got %@", letter1, letter2, res == NSOrderedSame ? @"NSOrderedSame" : @"NSOrderedDescending");
}
だから、質問は最終的には、Unicodeコードポイントを利用者名(または他の文字列)、どのように(局所的に)適切に我々の操作を行い、ソートに対応しますセクション名を返すが与えられていますlocalizedCompare:
によって指示された順序?
また、localizedCompare:
の場合、 "Ø"と "O"は明らかにNSOrderedSame
と表示されています。
ロケールはどのように設定されていますか?私は問題を再現するための問題があります。 –
@MartinR "en_US" – levigroker
これは同様の問題であるようですhttps://stackoverflow.com/questions/2167857/non-us-characters-in-section-headers-for-a-uitableview、おそらくそれらの回答の1つが役立ちます。 –