我在我编写的 Java 程序中对 unix sort 命令进行排序。但是,由于 Java 的字符串比较的行为与排序进行的比较不同,我遇到了问题。
来自 [Java 文档][1]:
按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。
从排序手册页:
* 警告 * 环境指定的语言环境会影响排序顺序。设置 LC_ALL=C 以获取使用本机字节值的传统排序顺序。
所以我的猜测是需要使用 LC_ALL=C 进行排序。但是我一直认为这意味着基于 ASCII 值排序,这意味着谁知道 unicode 会发生什么。
Gil*_*il' 10
的LC_COLLATE
语言环境类别控制的排序顺序。LC_ALL
设置所有类别。
使用LC_COLLATE=C
,字符串按字节排序。字节不必是ASCII字符(只有 0 到 127 之间的字节值是 ASCII)。在 unix 系统上,Unicode 几乎总是编码为UTF-8。UTF-8 具有将字符编码为字节序列保留其顺序的特性,因此按字节字典顺序对 UTF-8 字符串进行排序相当于按字符字典顺序对其进行排序。因此LC_COLLATE=C
适用于根据字符值按字典顺序对UTF-8 编码的Unicode 进行排序。
请注意,Java 实际上并不是根据 Unicode 字符值排序,而是根据它们的 UTF-16 编码。这与代理对有所不同,即如果您的代码点高于 65535。
UTF-8 字节表示排序、Java 排序和sort
GNU/Linux 上 UTF-8 语言环境中的实用程序都没有考虑组合字符,例如a?
(U+0061 LATIN SMALL LETTER A 后跟 U+0301 COMBINING ACUTE ACCENT) 的排序方式不同from á
(U+00E1 LATIN SMALL LETTER A WITH ACUTE)(在 UTF-8 语言环境中,两者最终都等同a
于第一遍,但第二遍按代码点排序)。