O pedido
Collation em LC_COLLATE
define não apenas a ordem de classificação dos caracteres individuais, mas também o significado dos intervalos de caracteres . Ou isso? Considere o seguinte snippet:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitivamente, B
não está em [a-z]
, portanto, isso não deve produzir nada. É o que acontece no Ubuntu 8.04 ou 10.04. Mas em algumas máquinas rodando Debian lenny ou squeeze, B
é encontrado, porque o intervalo a-z
inclui tudo o que está entre a
e z
na ordem de agrupamento, incluindo as letras maiúsculas B
a Z
.
Todos os sistemas testados têm o en_US
locale gerado. Também tentei variar a localidade: nas máquinas em que B
corresponde, o mesmo acontece em todas as localidades disponíveis (principalmente em latim: {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
, também chinês), exceto japonês (em qualquer codificação disponível) e C
/ POSIX
.
O que os intervalos de caracteres significam nas expressões regulares quando você excede o ASCII? Por que existe uma diferença entre algumas instalações Debian, por um lado, e outras instalações Debian e Ubuntu, por outro? Como outros sistemas se comportam? Quem está certo e quem deve ter um bug denunciado?
(Observe que estou perguntando especificamente sobre o comportamento de intervalos de caracteres, como [a-z]
in en_US
locales, principalmente em sistemas baseados em GNU libc. Não estou perguntando como corresponder a letras minúsculas ou a letras minúsculas ASCII .)
Em duas máquinas Debian, uma em que B
está em [a-z]
e outra em que não é, a saída de LC_COLLATE=en_US locale -k LC_COLLATE
é
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
e a saída de LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
é
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"