LC_COLLATE
による照合順序 個々の文字の並べ替え順序だけでなく、文字範囲の意味も定義します。それともそうですか?次のスニペットについて考えてみます。
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
直感的に、B
[a-z]
にありません 、したがって、これは何も出力しないはずです。それがUbuntu8.04または10.04で起こることです。ただし、Debian lennyまたはsqueezeを実行している一部のマシンでは、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に違いがあるのはなぜですか?他のシステムはどのように動作しますか?誰が正しいのか、誰に対してバグを報告する必要があるのか?
(特に、[a-z]
などの文字範囲の動作について質問していることに注意してください。 en_US
で ロケール、主にGNUlibcベースのシステム。小文字または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
以外のものを使用している場合 ロケールでは、[a-z]
のような範囲を使用しないでください これらはロケールに依存し、常に期待する結果が得られるとは限らないためです。すでに発生したケースの問題に加えて、一部のロケールでは発音区別符号を使用して文字を処理します(例:á )基本文字と同じ(つまり、 a 。
代わりに、名前付き文字クラスを使用してください:
echo B | grep '[[:lower:]]'
これにより、ロケールに対して常に正しい結果が得られます。ただし、入力テキストと適用しようとしているテストの両方の意味を反映するようにロケールを選択する必要があります。
関連:Php:imagechar —文字を水平方向に描画します
たとえば、特定のバイト値を見つける必要がある場合は、C
を使用します ロケール。常に利用可能です:
echo B | LANG=C grep '[a-z]'
これが期待どおりに機能しない場合は、実際にはバグです。