Порядок сортировки через LC_COLLATE
определяет не только порядок сортировки отдельных символов, но и значение диапазонов символов. Или это? Рассмотрим следующий фрагмент:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Интуитивно, B
не в [a-z]
, так что это не должно ничего выводить. Вот что происходит в Ubuntu 8.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
локалях, в первую очередь в системах на основе GNU libc. Я не спрашиваю, как сопоставлять строчные или строчные буквы ASCII.)
На двух машинах Debian, один из которых B
находится в [a-z]
и один , где он не, выход LC_COLLATE=en_US locale -k LC_COLLATE
IS
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
а выходной сигнал 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
языковой стандарт используется в качестве запасного варианта, и его порядок сопоставления - прямые байтовые значения, поэтому B
не будет совпадать. Тест в локали, которая появляется в выходных данных locale -a
.
en_US
генерируется, хотя.