【发布时间】:2017-06-28 18:07:35
【问题描述】:
我们正在尝试使用NSFetchedResultsController 来返回人名,并使用localizedCompare: 按排序顺序填充UITableView。我们还尝试在 UI 中提供一个部分索引(每个部分的第一个字符的右列)。我们在我们的实体上为NSFetchedResultsController 提供了一个选择器,该选择器提供了每个实体应该属于的部分(特别是人名的第一个字符,大写)。
在处理使用 Unicode 代码点的人名时,我们遇到了问题。 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: 返回的比较值对于整个“单词”与前导字符不同。
以下测试通过,但我希望 ("Ø" and "O") 与 ("Østerhus" and "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"
-
这似乎是一个类似的问题stackoverflow.com/questions/2167857/…,也许其中一个答案会有所帮助。
标签: ios cocoa core-data unicode localization