Urutan koleksi melalui LC_COLLATE
mendefinisikan 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, B
tidak 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, B
ditemukan, karena jangkauan a-z
mencakup semua yang ada di antara a
dan z
dalam urutan pemeriksaan, termasuk huruf kapital yang B
dilalui Z
.
Semua sistem yang diuji memang memiliki en_US
lokal yang dihasilkan. Saya juga mencoba memvariasikan lokal: pada mesin B
yang 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_US
lokal, terutama pada sistem berbasis libc GNU. Saya tidak bertanya bagaimana mencocokkan huruf kecil atau huruf kecil ASCII.)
Pada dua mesin Debian, satu di mana B
ada [a-z]
dan satu di mana tidak, output dari LC_COLLATE=en_US locale -k LC_COLLATE
adalah
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_COLLATE
is
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
lokal digunakan sebagai fallback, dan urutan susunannya adalah nilai byte langsung, jadi B
tidak akan cocok. Tes di lokal yang muncul di output locale -a
.
en_US
dihasilkan.