ios - 使用 Swift 对日文字符进行排序
问题描述
我有以下行按名称对项目列表进行排序:
let nameSort = NSSortDescriptor(key: "item.itemName", ascending: true, selector: #selector(NSString.caseInsensitiveCompare))
这适用于英文名称。但是对于日语,它会分别对平假名、片假名和汉字进行排序,而不是交织在一起。我注意到 iOS 联系人应用程序正确排序并且没有划分三个单独的脚本。想知道如何实现这一目标?
解决方案
您可以使用localizedCompare
orlocalizedCaseInsensitiveCompare
来解决平假名 v 片假名排序问题,但不能解决汉字问题。
您将其与联系人应用程序进行比较:不幸的是,联系人实际上捕获了您输入的拼音内容,将假名存储在单独的phoneticFamilyName
(例如,Tanaka 为 タナカ)中,而最终的汉字(例如,田中)存储在familyName
,例如。这样做是因为一旦将输入转换为汉字,所有读数都会映射到单个 unicode 序列。例如,无论您是通过チュウ 还是なか(取决于您输入的单词)输入中,生成的中字符仍然只是 unicode 0x4e2d。如果您想知道如何找到该字符,则需要将拼音拼写保存在单独的字段中。
归根结底,要求排序算法找出一些随机汉字序列的假名是一个不平凡的问题,因为它无法知道yomi或kun yomi或nanori上的哪个适用于任何给定的汉字。这就是联系人应用程序将其存储在单独字段中的原因。假名和罗马字之间有CFStringTransform
转换,但汉字没有。
从理论上讲,对字符串进行一些自然语言处理和/或字典解析似乎是可行的,但这让我觉得计算量相当大,而且尝试在排序例程中即时执行该操作可能不切实际。我建议将假名存储在一个单独的字段中,就像联系人框架一样。
推荐阅读
- spring - spring websocket/stomp + rabbitmq - convertAndSend,队列的目标路径
- swift - 将应用与 Audiounit、AUv3 协议集成
- laravel - Laravel 帆如何删除创建的应用程序
- git - Git - 向我的项目添加新功能,但尚未上线。需要进行快速更新并上线,但没有新功能
- mysql - 读取查询上的 AWS RDS mysql 死锁
- javascript - 如何在Angular中为以下案例编写开关案例的测试用例
- r - 如何解决R中reduce函数的问题
- python - 使用从文件到另一个文件的变量
- php - 函数 Illuminate\Mail\Mailer::to() 的参数太少,0 传递了错误 laravel
- android - 当以编程方式设置亮模式时,某些视图使用暗模式颜色