首页 > 解决方案 > 使用 Swift 对日文字符进行排序

问题描述

我有以下行按名称对项目列表进行排序:

let nameSort = NSSortDescriptor(key: "item.itemName", ascending: true, selector: #selector(NSString.caseInsensitiveCompare))

这适用于英文名称。但是对于日语,它会分别对平假名、片假名和汉字进行排序,而不是交织在一起。我注意到 iOS 联系人应用程序正确排序并且没有划分三个单独的脚本。想知道如何实现这一目标?

标签: iosswiftsortinglocalization

解决方案


您可以使用localizedCompareorlocalizedCaseInsensitiveCompare来解决平假名 v 片假名排序问题,但不能解决汉字问题。

您将其与联系人应用程序进行比较:不幸的是,联系人实际上捕获了您输入的拼音内容,将假名存储在单独的phoneticFamilyName(例如,Tanaka 为 タナカ)中,而最终的汉字(例如,田中)存储在familyName,例如。这样做是因为一旦将输入转换为汉字,所有读数都会映射到单个 unicode 序列。例如,无论您是通过チュウ 还是なか(取决于您输入的单词)输入中,生成的中字符仍然只是 unicode 0x4e2d。如果您想知道如何找到该字符,则需要将拼音拼写保存在单独的字段中。

归根结底,要求排序算法找出一些随机汉字序列的假名是一个不平凡的问题,因为它无法知道yomikun yominanori上的哪个适用于任何给定的汉字。这就是联系人应用程序将其存储在单独字段中的原因。假名和罗马字之间有CFStringTransform转换,但汉字没有。

从理论上讲,对字符串进行一些自然语言处理和/或字典解析似乎是可行的,但这让我觉得计算量相当大,而且尝试在排序例程中即时执行该操作可能不切实际。我建议将假名存储在一个单独的字段中,就像联系人框架一样。


推荐阅读