パスワードを忘れた? アカウント作成
416293 journal

okuの日記: LANG=en_US sort 2

日記 by oku

いつ頃からこうなっているのか知らないのですが、我が家の Gentoo linux な箱では、

$ echo 'A
a
b
B' | LANG=en_US sort

の結果は、

a
A
b
B

です(あまり「-f」に存在意義がない)。

多分、GNU coreutils-6.10 の sort が悪いわけではなくて、 strcoll(3C) が見ている先の LC_COLLATE の設定がどうかしてるせいではないかと思います。 それが証拠に、

$ echo 'A
a
b
B' | LANG=C sort

の結果は予想通り、

A
B
a
b

になりますし、

$ echo 'A
a
b
B' | LANG=C sort -f

の結果も予想通り、

A
a
B
b

となってくれます。

これ、困る人は相当いるのではないか?というわけで「en_US」以外の locale も試してみようと思ったのですが、我が家では「en_US*」と「ja_JP*」以外の locale を入れる習慣がないので、ちょっと手間暇が掛かりそうです。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 辞書順 (スコア:1, 参考になる)

    by Anonymous Coward on 2008年02月23日 16時16分 (#1302331)
    辞書順(電話帳順とも)に並べるためにわざわざあるんだから、わきから変な仕様変更しないでよ。

    SunOSのマニュアルより。

    並べ換えオプション

    デフォルトのソートの並び換え順は、LC_COLLATE の値に依存します。LC_COLLATE が C に設定された場合、ASCII の並べ換え順でソートされます。LC_COLLATE が en_US に設定された場合、ある 2 つの文字列のうち、一方が他方よりも先に大文字を使用していて その他の点では一様である場合は 大文字・小文字を区別しますが、それ以外は大文字・小文字を区別しません。その他のロケールでは、別の並べ換え順でソートされます。
    • by oku (4610) on 2008年02月23日 18時01分 (#1302379) 日記

      へぇ~、こりゃ書いてみるものですね。 Solaris のドキュメントには確かにそう書かれているのを確認しました (POSIX の sort(1) manpage には書かれていないけど、筋論からいくと locale データベースの仕様に属する話だと思うので、書かれていない方が寧ろ当然か)。

      手元で「en_GB」「fr_FR」の locale データベースを作って試してみたところ、「en_US」と同じように振舞いましたので、欧米人にとってはデフォルトで sort -fd みたいな振る舞いをしてくれた方が嬉しいということなのかしらん。 Cygwin [cygwin.com] みたいに真っ当に locale をサポートしてない環境と行ったり来たりしていると、間違いなくハマリそうな気がするんですけどねえ...

      親コメント
typodupeerror

あつくて寝られない時はhackしろ! 386BSD(98)はそうやってつくられましたよ? -- あるハッカー

読み込み中...