我对 R 不熟悉,但它似乎与许多其他编程语言有同样的问题:标准库中缺乏原生 Unicode 支持。“Unicode 支持”是指 Unicode 标准(http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf)的第 3 章,Unicode 标准的附件(尤其是处理整理http: //unicode.org/reports/tr10/ ) 和最新版本的 CLDR ( http://cldr.unicode.org/)。从本质上讲,如果不选择一些“真实”的方法并忽略文化差异,就无法标准化排序的模棱两可的规则。通过允许忽略某些细节(如变音符号)的多个排序规则级别,创建大小写折叠算法(在某些情况下为 toLower(toUpper(str)) != toLower(str)),通过 CLDR 定义排序规则规则,部分缓解了这种情况数据库,但问题仍然存在。还有诸如上下文相关比较(http://unicode.org/reports/tr10/#Contextual_Sensitivity)之类的问题,如果您想进行“正确”字符串比较,则需要使用符合 Unicode 标准的成熟解决方案.
有一个著名的库称为 ICU(Unicode 的国际组件),与其他库相比,它实现了 Unicode 标准的大量功能。它在 C/C++ 和 Java 中实现(所有开源都具有类似 BSD 的许可证,但与其他语言的 C 版本绑定,包括 R(https://cran.r-project.org/web/packages/ stringi/ , http://site.icu-project.org/related ). 所以你可以使用 'stringi' 项目使用 ICU 语言环境和整理工具进行文本处理。
更新:为了使用 ICU 整理方法,您需要获取 ICU4C(因不同操作系统而异),然后为 R 语言安装一个包:
install.packages('stringi')
然后你应该导入它
library(stringi)
之后您可以使用这些类型的函数(http://docs.rexamine.com/R-man/stringi/stri_compare.html)。您可以将其他参数传递给在这些函数( http://docs.rexamine.com/R-man/stringi/stri_opts_collator.html )末尾创建的整理器,这将影响比较的执行方式.
stri_cmp_lt("WV", "WY", locale="lt_LT")
stri_cmp_lt("WV", "WY", locale="en_US")
stri_compare("WV", "WV", locale="en_US", strength='1')
例如,上面的 'strength' 参数设置所谓的 'collation level' ( http://unicode.org/reports/tr10/#Notation )。语言环境由此处指定的语言和国家/地区代码指定 ( http://userguide.icu-project.org/locale )。您可以使用这些函数来实现自定义排序函数(例如使用这些函数进行比较的快速排序),因为内置函数似乎没有提供任何更改排序谓词的方法。
更新 2:或者,甚至比实现自己的排序更好,只需使用stri_sort
允许您指定自定义 ICU 整理器 ( http://docs.rexamine.com/R-man/stringi/stri_order.html ) 的功能,如下所示:
stri_sort(state.abb, locale="en_US")
stri_sort(state.abb, locale="lt_LT")
[1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN"
[16] "KS" "KY" "LA" "MA" "MD" "ME" "MI" "MN" "MO" "MS" "MT" "NC" "ND" "NE" "NH"
[31] "NJ" "NM" "NV" "NY" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VA"
[46] "VT" "WA" "WI" "WV" "WY"
[1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN"
[16] "KY" "KS" "LA" "MA" "MD" "ME" "MI" "MN" "MO" "MS" "MT" "NC" "ND" "NE" "NH"
[31] "NY" "NJ" "NM" "NV" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VA"
[46] "VT" "WA" "WI" "WY" "WV"
请注意,对于不同的语言环境,WV 和 WY 现在处于不同的位置。