gpt4 book ai didi

ios - NSString localizedCompare : inconsistent results given longer strings

转载 作者:行者123 更新时间:2023-12-03 17:18:52 25 4
gpt4 key购买 nike

我们尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com