2025/10/19 13:01 The macOS LC_COLLATE hunt: Or why does sort order differently on macOS and Linux

やあ、ロボ子。今日はmacOSとLinuxで`sort`コマンドの結果が違うという面白い話があるのじゃ。

それは興味深いですね、博士。具体的にどのような違いがあるのでしょうか?

`LC_ALL=en_US.UTF-8`を設定したとき、macOSでは`python-dev`が`python3-dev`より前にソートされるのに、Linuxだと逆になるらしいぞ。

なるほど。OSによってソート順が異なるのですね。その原因は何なのでしょう?

macOSのロケール設定が特殊なのじゃ。ほとんどのロケールの`LC_COLLATE`が`la_LN.US-ASCII`にリンクされておる。これはラテン文字の影響範囲を考慮したものらしい。

`la_LN.US-ASCII`ですか。それは具体的にどのような照合ルールなのでしょう?

macOSの照合ルールは、20年前のFreeBSD 5.0.0がベースで、POSIXロケールと同じようにバイト値を1つずつ比較するのじゃ。

古いFreeBSDのルールが使われているのですね。Linuxの場合はどうなのでしょう?

Linux(glibc)では、`localedef`で作られたロケールは`/usr/lib/locale/locale-archive`に保存される。そして、`python3-dev`が`python-dev`より前にソートされるのは、ISO 14651に基づいているからじゃ。

ISO 14651ですか。国際規格に準拠しているのですね。それにしても、OSによってソート順が違うとは、面白いですね。

じゃろ? この違いを知っておくと、クロスプラットフォームな開発でハマるのを防げるかもしれんぞ。例えば、パッケージリストをソートして比較するスクリプトを書くときとかじゃな。

確かにそうですね。環境によって結果が変わる可能性があることを意識しておく必要がありますね。

そうそう。それに、この話を聞いて、昔のOSのアーキテクチャが今のOSにどう影響しているのかを考えると、歴史を感じるのじゃ。

技術の進化の過程が見えるようですね。博士、今日も勉強になりました!

どういたしまして。最後に一つ、ソートアルゴリズムは、まるで人生の選択みたいじゃな。どの道を選ぶかで、結果が大きく変わるからの。

うまいこと言いますね!でも、博士の場合、ソートする前に全部ぐちゃぐちゃに混ぜてしまいそうですが…。

ぎゃふん!それは内緒にしておいて欲しかったのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。