LANG=C
para obter essa sensação de calor.) A definição técnica é um documento padrão Unicode , e eu tentei destilar um pouco disso aqui. Correções recebidas com alegria.
Acho interessante ler que locale é uma propriedade do usuário que manipula os dados, não dos dados em si. O documento técnico faz alguns esforços para esclarecer isso com referência à ordem de classificação para um usuário alemão que é diferente da de um usuário sueco, mesmo que os caracteres usados nas sequências de exemplo sejam os mesmos.
As localidades en_GB e en_US estão configuradas para ignorar o caractere -
. Muito simplificadas, as regras de classificação desses locais para a ordem crescente são:
- O caso é insensível
- Se você tiver duas strings em que uma é a mesma e a outra, mas mais longa, ela classifica em segundo. Então
xyzA
é sempre depois dexyz
- Alguma pontuação (nessa situação incluindo
-
) é ignorada, a menos que seja comparada a outra pontuação - Digitar classificar antes das letras
- Os dígitos são classificados
0
..9
- As letras são classificadas
[Aa]
..[Zz]
(en_GB e en_US não têm sotaque) - A pontuação é classificada (mas não é relevante para os exemplos nesta resposta)
Aplicando essas regras aos conjuntos de dados em questão:
a_1 a_10 a_11 a_12
Isso equivale a a1
a10
a11
a12
e, considerando a regra 2, obtemos que a1
deve ser antes de a10
e a11
. Qualquer coisa diferente de a1
tem o mesmo número de caracteres alfanuméricos para que possam ser comparados de forma consistente. Isso nos dá a_1
a_10
a_11
a_12
.
a_10-18 a_11-18 a_1-18 a_12-18
Aplicam-se as mesmas regras, exceto que o número 3 também se aplica (ignoramos pontuação). Isso significa que podemos considerar os valores como a_1018
a_1118
a_118
a_1218
e, seguindo as regras # 2 e # 4, recebemos o pedido a_10-18
a_11-18
a_1-18
a_12-18
.
Tomando nosso exemplo final dos comentários
a_10 a_10- a_100 a_101 a_10-18 a_102
Regras # 3 e, em seguida, # 2, # 4 se aplicam. Portanto, removemos (ignoramos) os caracteres -
, o que nos dá a_10
a_10
a_100
a_101
a_1018
a_102
e classificamos o restante pelo prefixo de subcadeia comum e depois pela ordem dos caracteres.
(Não está claro para mim se temos a_10
e, em seguida, a_10-
em virtude da extensão, ou apenas porque acaba sendo assim. Estou tentado a sugerir a segunda opção, mas eu amar alguém para confirmar isso.)