Esse comportamento é puramente uma função da ordenação de agrupamento controlada por seu LC_COLLATE
locale. Como você tem um conjunto de códigos de idioma Unicode, o glibc usa a ordem de intercalação Unicode especificada em uma de suas variantes definidas, que tenta ser um tipo "natural".
Esta ordenação é o Algoritmo de Ordenação Unicode UTS 10 , com ajuste de deslocamento de elementos de agrupamento variáveis e usando (provavelmente) o elemento de agrupamento padrão tabela . De fato, caracteres como #
, mas também a maioria das outras pontuações e espaços em branco, são tratados como menos significativos que as diferenças entre os caracteres alfanuméricos seguintes e usados apenas para quebrar vínculos. Todo o algoritmo é definido com algum detalhe no padrão e fica ainda mais complexo.
às vezes aconselhado não para definir LANG
ou LC_COLLATE
por esse motivo . Você pode, em vez disso, definir LC_CTYPE
(para UTF-8) e LC_MESSAGES
(para o idioma de mensagem preferido) e manter o agrupamento no padrão POSIX. Existem efeitos de fluxo de qualquer forma para essa escolha.
No seu sistema, isso provavelmente está definido em /usr/share/i18n/locales/iso14651_t1_common
, que é incluído por iso14651_t1
, que é incluído por en_US
. As ordenações de outros locais são definidas nos arquivos próximos, geralmente com base no mesmo padrão com alterações localizadas (por exemplo, sv_SE
usa a mesma base, mas reordena ...zåäöø
, recolhe v
e w
, etc). Esta tabela, selecionada por LC_COLLATE
, é o que realmente determina o comportamento em seu sistema e é derivada de (uma versão passada) do padrão Unicode. Em sistemas mais novos ou mais antigos, usando diferentes versões Unicode, as mesmas strings podem ser comparadas de maneira diferente.
Outras codificações terão suas próprias tabelas separadas que podem ser totalmente não relacionadas.
Você pode verificar o comportamento do seu sistema em relação à especificação, classificando um arquivo contendo strings das tabelas de comparação fornecidas no UTR:
demark de‐Luge death deluge ☠sad de-luge de Luge ☠happy de‐luge ♡sad deLuge de luge ♡happy de-Luge
(há hífens e hífen-minuses nessas palavras)
A ordem que você deve receber é:
death
deluge
de luge
de-luge
de‐luge
deLuge
de Luge
de-Luge
de‐Luge
demark
☠happy
♡happy
☠sad
♡sad
(Alguns) explicação expositiva é dada para esse resultado no relatório:
Shifted. The hyphen-minus and hyphen are grouped together, and their
differences are less significant than the casing differences in the
letter "l". This grouping results from the fact that they are
ignorable, but their fourth level differences are according to the
original primary order, which is more intuitive than Unicode order.
The symbols ☠ and ♡ are ignored on levels 1-3.Shift-Trimmed. Note how “deLuge” comes between the cased versions with spaces and hyphens. The symbols ☠ and ♡ are ignored on levels 1-3.
É um pouco denso. "Níveis 1-3" são diferentes níveis de peso de desempate no algoritmo, sendo o nível primário 1 o diferenciador mais importante. Esta é provavelmente mais informação do que você precisa, mas você pode pelo menos determinar que é a ordem de agrupamento especificada que cria o resultado que você está vendo.