Впорядкування замовлення через 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_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
є
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
мова використовується як резервна копія, а порядок її порівняння є прямими байтовими значеннями, тому B
їх не буде відповідати. Тест у локалі, який відображається у висновку locale -a
.
en_US
генерується він.