Urutan koleksi melalui LC_COLLATEmendefinisikan tidak hanya urutan urutan karakter individu, tetapi juga arti rentang karakter. Atau apakah itu? Pertimbangkan cuplikan berikut:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Secara intuitif, Btidak ada [a-z], jadi ini seharusnya tidak menghasilkan apa-apa. Itulah yang terjadi di Ubuntu 8.04 atau 10.04. Tetapi pada beberapa mesin yang menjalankan Debian lenny atau squeeze, Bditemukan, karena jangkauan a-zmencakup semua yang ada di antara adan zdalam urutan pemeriksaan, termasuk huruf kapital yang Bdilalui Z.
Semua sistem yang diuji memang memiliki en_USlokal yang dihasilkan. Saya juga mencoba memvariasikan lokal: pada mesin Byang cocok di atas, hal yang sama terjadi di setiap lokal yang tersedia (kebanyakan berbasis latin:, {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}juga lokal Cina) kecuali Jepang (dalam penyandian yang tersedia) dan C/ POSIX.
Apa arti rentang karakter dalam ekspresi reguler , ketika Anda melampaui ASCII? Mengapa ada perbedaan antara beberapa instalasi Debian di satu sisi, dan instalasi Debian lainnya dan Ubuntu di sisi lain? Bagaimana sistem lain berperilaku? Siapa yang benar, dan siapa yang seharusnya melaporkan bug?
(Perhatikan bahwa saya secara khusus bertanya tentang perilaku rentang karakter seperti [a-z]di en_USlokal, terutama pada sistem berbasis libc GNU. Saya tidak bertanya bagaimana mencocokkan huruf kecil atau huruf kecil ASCII.)
Pada dua mesin Debian, satu di mana Bada [a-z]dan satu di mana tidak, output dari LC_COLLATE=en_US locale -k LC_COLLATEadalah
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
dan output dari LC_COLLATE=en_US.utf8 locale -k LC_COLLATEis
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
Clokal digunakan sebagai fallback, dan urutan susunannya adalah nilai byte langsung, jadi Btidak akan cocok. Tes di lokal yang muncul di output locale -a.
en_USdihasilkan.