- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们尝试使用 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:
返回的比较值对于整个“单词”与前导字符来说是不同的。
以下测试通过,但我希望(“Ø”和“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:
显然将“Ø”和“O”视为 NSOrderedSame
后跟附加字符,这是怎么回事?
最佳答案
我预计 localizedCompare:
正在使用导致此行为的 NSStringCompareOptions
标志的特定组合。 https://developer.apple.com/documentation/foundation/nsstringcompareoptions?preferredLanguage=occ
通过使用 compare:options:
并打开 NSDiacriticInsensitiveSearch
,您可能会得到您想要的结果。
为了生成节索引,最好先去除所有扩展字符的值,然后获取第一个字母。像这样的东西:
[[str1 stringByFoldingWithOptions:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch] substringToIndex:1]
这样,在您获取该部分的第一个字母之前,以重音字母开头的名称(例如“Édward”)将被转换为“Edward”。
关于ios - NSString localizedCompare : inconsistent results given longer strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809680/
我们尝试使用 NSFetchedResultsController 返回人名,并使用 localizedCompare: 按排序顺序填充 UITableView。我们还尝试在 UI 中提供部分索引(每
我是一名优秀的程序员,十分优秀!