Впорядкування замовлення через 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 або віджимають, 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_COLLATEIS
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мова використовується як резервна копія, а порядок її порівняння є прямими байтовими значеннями, тому Bїх не буде відповідати. Тест у локалі, який відображається у висновку locale -a.
en_USгенерується він.