El orden de LC_COLLATE
clasificación define no solo el orden de clasificación de los caracteres individuales, sino también el significado de los rangos de caracteres. O lo hace? Considere el siguiente fragmento:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitivamente, B
no está dentro [a-z]
, por lo que esto no debería generar nada. Eso es lo que sucede en Ubuntu 8.04 o 10.04. Sin embargo, en algunas máquinas que ejecutan Lenny Debian o apretón, B
se encuentra, ya que el rango a-z
incluye todo lo que está entre a
y z
en el orden de clasificación, incluyendo las mayúsculas B
a través Z
.
Todos los sistemas probados tienen la en_US
configuración regional generada. También intenté variar la configuración regional: en las máquinas en las que B
se hace coincidir anteriormente, sucede lo mismo en todas las configuraciones regionales disponibles (en su mayoría basadas en latín {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
, también en configuraciones regionales chinas), excepto en japonés (en cualquier codificación disponible) y C
/ POSIX
.
¿Qué significan los rangos de caracteres en las expresiones regulares , cuando vas más allá de ASCII? ¿Por qué hay una diferencia entre algunas instalaciones de Debian por un lado, y otras instalaciones de Debian y Ubuntu por el otro? ¿Cómo se comportan otros sistemas? ¿Quién tiene razón y contra quién se debe informar un error?
(Tenga en cuenta que estoy preguntando específicamente sobre el comportamiento de los rangos de caracteres, como [a-z]
en las en_US
configuraciones regionales, principalmente en los sistemas basados en GNU libc. No estoy preguntando cómo hacer coincidir letras minúsculas o minúsculas ASCII).
En dos máquinas Debian, una donde B
está adentro [a-z]
y otra donde no está, la salida de LC_COLLATE=en_US locale -k LC_COLLATE
es
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
y la salida de LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
es
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
entorno local se utiliza como reserva y su orden de clasificación es de valores de bytes directos, por B
lo que no coincidirá. Pruebe en un entorno local que aparezca en la salida de locale -a
.
en_US
embargo, no se verificó si se genera.