如何让 unix sort 以与 Java 相同的顺序排序(按 unicode 值)

Aar*_*man 5 java sort unicode

我在我编写的 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 排序和sortGNU/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于第一遍,但第二遍按代码点排序)。