A ordem de intercalaçãoLC_COLLATE
define não apenas a ordem de classificação de caracteres individuais, mas também o significado dos intervalos de caracteres. Ou faz? Considere o seguinte snippet:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitivamente, B
não está presente [a-z]
, portanto, isso não deve gerar nada. É o que acontece no Ubuntu 8.04 ou 10.04. Mas em algumas máquinas rodando Debian Lenny ou aperto, B
é encontrado, porque a gama a-z
inclui tudo o que está entre a
e z
na ordem de agrupamento, incluindo as letras maiúsculas B
através Z
.
Todos os sistemas testados têm o en_US
código do idioma gerado. Também tentei variar o código do idioma: nas máquinas com as B
correspondências acima, o mesmo acontece em todos os códigos de idioma disponíveis (principalmente com base em latim: {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
também códigos de idioma chinês), exceto no japonês (em qualquer codificação disponível) e C
/ POSIX
.
O que significam intervalos de caracteres em expressões regulares quando você ultrapassa 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 se comportam outros sistemas? Quem está certo e contra quem um bug deve ser relatado?
(Observe que estou perguntando especificamente sobre o comportamento dos intervalos de caracteres, como [a-z]
nas en_US
localidades, principalmente nos sistemas baseados em GNU libc. Não estou perguntando como combinar letras minúsculas ou letras minúsculas ASCII.)
Em duas máquinas Debian, uma onde B
está [a-z]
e outra onde não está, 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"
C
idioma será usado como substituto, e sua ordem de intercalação será de valores de bytes diretos, portanto B
, não será correspondida. Teste em um código de idioma que aparece na saída de locale -a
.
en_US
Porém, não verificou se é gerado.