Java

如何讓 unix 排序以與 Java 相同的順序排序(按 unicode 值)

  • February 20, 2017

我在我編寫的 Java 程序中對 unix sort 命令進行了排序。但是,Java 的字元串比較的行為與排序完成的比較不同,因此我遇到了問題。

來自

$$ Java Doc $$$$ 1 $$:

按字典順序比較兩個字元串。比較基於字元串中每個字元的 Unicode 值。

從排序手冊頁:

*** 警告 *** 環境指定的語言環境會影響排序順序。設置 LC_ALL=C 以獲得使用本機字節值的傳統排序順序。

所以我的猜測是需要用 LC_ALL=C 排序。但是我一直認為這意味著基於 ASCII 值的排序,這意味著誰知道 unicode 會發生什麼。

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 語言環境中的實用程序都不會考慮組合字元,例如(U+0061 LATIN SMALL LETTER A 後跟 U+0301 COMBINING ACUTE ACCENT)的排序方式不同from á(U+00E1 LATIN SMALL LETTER A WITH ACUTE) (在 UTF-8 語言環境中,兩者最終都等同a於第一遍,但第二遍按程式碼點排序)。

引用自:https://unix.stackexchange.com/questions/31886