【问题标题】:UItableView search korean textUItableView 搜索韩文
【发布时间】:2012-12-17 09:18:02
【问题描述】:

在我们的 UItableView 搜索中,我们使用下面的代码在单元格内容中搜索键入的文本

NSComparisonResult result = [eachCellContent compare:searchText options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];

这工作正常。但这不适用于韩文。

例如: 假设其中一个单元格文本是“소”。//我们通过输入这两个字母 ㅅ 和 ㅗ 得到这个组合 如果我们只键入 ㅅ ,我们的比较方法不起作用,因此不会列出“소”。 (如果我们同时输入ㅅ和ㅗ,它就可以工作)

但上面的示例与 AddressBook 应用程序配合得很好。

还有其他比较方法可以支持吗? (我们还需要这个 NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch )

感谢阅读。

【问题讨论】:

  • 我更新的答案有帮助吗?
  • 是的。它在添加参数“locale:[NSLocale currentLocale]”时起作用。谢谢马丁 :)

标签: objective-c ios uitableview search


【解决方案1】:

您可以尝试使用

规范化字符串
NSString *normalizedContent = [eachCellContent decomposedStringWithCanonicalMapping];
NSString *normalizedSearch = [searchText decomposedStringWithCanonicalMapping];

然后比较这些。


更新:以下算法在我的测试项目中有效:

NSString *eachCellContent = @"소";
NSString *searchText = @"ㅅ";

NSString *normalizedContent = [eachCellContent decomposedStringWithCanonicalMapping];
NSString *normalizedSearch = [searchText decomposedStringWithCanonicalMapping];

NSComparisonResult result = [normalizedContent compare:normalizedSearch
                                               options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch
                                                 range:NSMakeRange(0, [normalizedSearch length])
                                                locale:[NSLocale currentLocale]];
if (result == NSOrderedSame) {
    NSLog(@"same");
}
// Output: same

除了分解 Unicode 字符之外,“诀窍”是使用本地化比较。

【讨论】:

  • 感谢回复。但它不起作用! NSString *normalizedContent = [eachCellContent decomposedStringWithCanonicalMapping]; NSString *normalizedSearch = [searchText decomposedStringWithCanonicalMapping]; NSComparisonResult 结果 = [normalizedContent compare:normalizedSearch options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, [normalizedSearch length])]; if (result == NSOrderedSame){ //不来这里 }
  • @david:好吧,这只是一个想法,但我不会说韩语,所以我无法真正测试这个。 - 也许您可以显示NSLog(@"%@", [eachCellContent dataUsingEncoding:NSUTF32BigEndianStringEncoding]);NSLog(@"%@", [searchText dataUsingEncoding:NSUTF32BigEndianStringEncoding]); 的输出,这可能有助于找到问题。
  • @david:我已经用新代码更新了我的答案,你能检查一下吗?
  • 是的,谢谢马丁 :)。你知道我们在从 sqlite 表查询时能达到同样的效果吗(因为如果记录太多,我们正在从数据库中搜索 - 在这种情况下,tableview 不会加载所有记录 -)
  • @david:你使用 Core Data 还是普通 sqlite?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多