照合順序LC_COLLATE
は、個々の文字の並べ替え順序だけでなく、文字範囲の意味も定義します。それともそうですか?次のスニペットを検討してください。
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
直感的にB
はにない[a-z]
ので、何も出力されません。それがUbuntu 8.04または10.04で起こります。しかし、Debianのレニーやスクイズを実行しているいくつかのマシン上で、B
範囲があるため、発見されたa-z
の間だすべてのものが含まa
とz
大文字を含む照合順序で、B
スルーをZ
。
テストされたすべてのシステムには、en_US
ロケールが生成されています。また、ロケールを変更しようとしました:B
上記と一致するマシンでは、{en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
日本語(使用可能なエンコーディング)およびC
/ を除くすべての使用可能なロケール(ほとんどがラテン語ベース:、中国語ロケールも)で同じことが起こりますPOSIX
。
ASCIIを超える場合、正規表現で文字範囲は何を意味しますか?一部のDebianインストールと他のDebianインストールとUbuntuの間に違いがあるのはなぜですか?他のシステムはどのように動作しますか?誰が正しいのか、誰に対してバグを報告すべきか?
(主にGNU libcベースのシステム[a-z]
でのen_US
ロケールなどの文字範囲の動作について具体的に尋ねていることに注意してください。小文字またはASCII小文字の一致方法は尋ねていません。)
2台のDebianマシンで、1台B
が入っ[a-z]
ているものと入っていないものの出力LC_COLLATE=en_US locale -k LC_COLLATE
は
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
そしての出力LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
は
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
フォールバックとして使用され、その照合順序はストレートバイト値であるため、B
一致しません。の出力に表示されるロケールでテストしますlocale -a
。
en_US
ただし、が生成されたかどうかは確認しませんでした。