KolejnośćLC_COLLATE
sortowania przez określa nie tylko kolejność sortowania poszczególnych znaków, ale także znaczenie zakresów znaków. A może to? Rozważ następujący fragment kodu:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuicyjnie, B
nie ma go [a-z]
, więc nie powinno to nic generować. Tak dzieje się w Ubuntu 8.04 lub 10.04. Jednak na niektórych komputerach z systemem Debian lenny ani zgniatać, B
zostanie odnaleziony, ponieważ zakres a-z
obejmuje wszystko, co znajduje się pomiędzy a
i z
w kolejności sortowania, włącznie z literami B
dzięki Z
.
Wszystkie testowane systemy mają en_US
wygenerowane ustawienia narodowe. Próbowałem także zmieniać ustawienia regionalne: na maszynach, które B
są dopasowane powyżej, to samo dzieje się we wszystkich dostępnych ustawieniach narodowych (głównie w języku łacińskim:, {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
także chińskie ustawienia regionalne) oprócz japońskiego (w dowolnym dostępnym kodowaniu) i C
/ POSIX
.
Co oznaczają zakresy znaków w wyrażeniach regularnych , gdy wykraczasz poza ASCII? Dlaczego istnieje różnica między niektórymi instalacjami Debiana z jednej strony, a innymi instalacjami Debiana i Ubuntu z drugiej strony? Jak zachowują się inne systemy? Kto ma rację i komu powinien zostać zgłoszony błąd?
(Należy pamiętać, że jestem specjalnie prosząc o zachowanie charakteru zakresów takich jak [a-z]
w en_US
lokalizacjach, głównie w systemach opartych na GNU libc. Nie pytam jak dopasować małe litery lub liter ASCII małe).
Na dwóch maszynach Debiana, jeden tam, gdzie B
jest, [a-z]
a drugi tam, gdzie go nie ma, wynikiem LC_COLLATE=en_US locale -k LC_COLLATE
jest
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
a wyjściem LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
jest
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
ustawienia narodowe są używane jako rezerwowe, a ich kolejność sortowania to wartości w bajtach prostych, więc B
nie zostaną dopasowane. Przetestuj w ustawieniach regionalnych wyświetlanych na wyjściu locale -a
.
en_US
jest generowany.