L' ordre de LC_COLLATE
classement via définit non seulement l'ordre de tri des caractères individuels, mais également la signification des plages de caractères. Ou alors? Considérez l'extrait de code suivant:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitivement, B
n'est pas dedans, [a-z]
donc cela ne devrait rien produire. C'est ce qui se passe sur Ubuntu 8.04 ou 10.04. Mais sur certaines machines en cours d' exécution ou de Debian Squeeze, B
se trouve, parce que la gamme a-z
comprend tout ce qui est entre a
et z
dans l'ordre de classement, y compris les lettres majuscules B
par Z
.
Tous les systèmes testés ont en_US
généré les paramètres régionaux. J'ai également essayé de faire varier les paramètres régionaux: sur les machines où B
est comparé ci-dessus, la même chose se produit dans tous les paramètres régionaux disponibles (principalement en latin {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
:, également dans les paramètres régionaux chinois) sauf le japonais (dans n'importe quel encodage disponible) et C
/ POSIX
.
Que signifient les plages de caractères dans les expressions régulières , lorsque vous allez au-delà de l'ASCII? Pourquoi y a-t-il une différence entre certaines installations Debian d'une part, et d'autres installations Debian et Ubuntu d'autre part? Comment se comportent les autres systèmes? Qui a raison et contre qui un bug devrait-il être signalé?
(Notez que je pose spécifiquement des questions sur le comportement des plages de caractères telles que [a-z]
dans les en_US
locales, principalement sur les systèmes basés sur la libc GNU. Je ne demande pas comment faire correspondre les lettres minuscules ou les lettres minuscules ASCII.)
Sur deux machines Debian, une où se B
trouve [a-z]
et une où elle ne l'est pas, la sortie de LC_COLLATE=en_US locale -k LC_COLLATE
est
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
et la sortie de LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
est
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
paramètres régionaux sont utilisés comme solution de repli et leur ordre de classement est des valeurs d'octets droits, donc B
ils ne seront pas mis en correspondance. Testez dans un environnement local qui apparaît dans la sortie de locale -a
.
en_US
est généré, cependant.