我在我编写的 Java 程序中使用 unix sort 命令进行排序。然而,我遇到了由于 Java 字符串比较的行为与排序比较不同而引起的问题。
来自 [Java 文档][1]:
按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。
从排序手册页:
* 警告 * 环境指定的区域设置会影响排序顺序。设置 LC_ALL=C 以获取使用本机字节值的传统排序顺序。
所以我的猜测是需要用 LC_ALL=C 进行排序。然而我一直认为这意味着基于 ASCII 值进行排序,这意味着谁知道 unicode 会发生什么。
答案1
这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 语言环境中的实用程序都不接受组合字符考虑到,例如á
(U+0061 LATIN SMALL LETTER A 后跟 U+0301 COMBINING ACUTE ACCENT) 的排序方式与á
(U+00E1 LATIN SMALL LETTER A WITH ACUTE) 不同(在 UTF-8 语言环境中,两者最终都a
相当于第一遍但第二遍按代码点排序)。