「POSIX ロケール」とはどういう意味ですか?

「POSIX ロケール」とはどういう意味ですか?

この質問次のようなコメントがあります。

これらすべては、「POSIX ロケール」の意味を理解していないことから生じています。(-: ギリシャ語の小文字を (たとえば) sed と [[:lower:]] および便利な el_GR.UTF-8 ロケール セットで一致させるように実際に試す必要があります。 – JdeBP

では、「POSIX ロケール」とはどういう意味でしょうか?

ボーナス: これは C 以外のロケールの POSIX でも有効ですか?

LC_ALL=C grep '[[:lower:]]' file

答え1

POSIXでは(「上位」の場合)

POSIX ロケールでは、次の場合のみ:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

以下が含まれるものとする:

これは POSIX ロケールを定義しています。つまり、POSIX ロケールのコンテキストでは、「上位」文字クラスはリストされている文字のみで構成されます。

POSIX は他のロケールを定義していませんが、システムは自由に定義できます。その結果、grep '[[:lower:]]' filePOSIX のみに限定すると、POSIX 以外のロケールで何か有用なことを実行できるとは期待できません。ただし、多くのシステムでは他のロケールとその文字クラスが定義されています。たとえば、GNU C ライブラリのロケールを使用するシステムでは、

$ echo 'α' | LC_ALL=el_GR.UTF-8 grep '[[:lower:]]'
α

(これはel_GR.UTF-8ロケールが利用可能であることを前提としています。Debian 派生版では、これを簡単に確認するにはパッケージをインストールしますlocales-all。)

答え2

私はあなたの提案を完全に理解していません(他の質問で)。しかし、あなたは使用例を誤解しているようです。POSIX ロケール

あなたの提案は、その場所があまりユーザー友好的であるように調整されるべきである。しかしユーザーフレンドリーであることは POSIX ローカルの目的ではありません。それは他のルールを持つ他のロケールの役割です。

posix ローカルの役割は、予測可能であることです。実際、シンプルであることも利点です。いったん他の言語を標準に含め始めると、それを止めるのは非常に難しくなり、結果として、多くのメンテナンスが必要で実装が難しい標準になります。

開発者である私が、すべての言語のすべてのルール、それらを「アルファベット順」に並べ替える方法、そして実際にどれが大文字でどれが小文字かを知る方法を知ることは不可能です。英語以外の言語のルールは、実に複雑です。したがって、Posix ローカルを調整して他のすべての言語のルールを含めると、その動作は実に予測不可能になります。

POSIX ロケールの変更は、古いシステムが新しいシステムの動作と一致しないソフトウェアにとって、確かに致命的となる可能性があります。(以下の逸話を参照)


逸話

私が今まで見た中で最もわかりにくく、診断が難しいバグの一つは、ETLツール行を「ランダムに」削除します。綿密な分析の結果、ソフトウェアは正常に動作しますが、LC_COLLATE=C で実行した場合のみ動作することが判明しました。これは、レコードを照合するときに、データベースのソート順とそれ自身の内部ソート順が一致することに依存していたためです。開発者は、一部のロケールでは数字がアルファベット順にテキストをソートする順序が「-1、-2、1、2」ではなく「0、-1、1、-2、2」になることにまったく気付いていませんでした。

ユーザーとのやり取りとはまったく別に、これが示しているのは、すべてのシステムに共通する予測可能な方法でシステムが動作することが本当に必要であるということです。

関連情報