No agrupamento utf-8, por que 11- é menor que 1-?

7

Descobri que o resultado da classificação em ASCII:

Arquivo de origem test :

1-
11-
1-a
11-a

Classifique usando ASCII:

$ LANG=en_US.ascii sort test
1-
1-a
11-
11-a

E usando o UTF-8:

$ LANG=en_US.utf8 sort test
1-
11-
11-a
1-a

Eu sinto que é tão contra-intuitivo, e não é uma ordem de dicionário.

O caractere '-' ( 002d ) não é sempre menor que [0-9] ( 0030-0039 )? Qual é a regra geral no agrupamento UTF-8?

E como ignorá-lo, basta fazer com que - seja menor que [0-9] enquanto mantém outros caracteres inalterados para UTF-8 no Linux? (Isso pode afetar o resultado de ls --sort , sort , etc.)

    
por Xiè Jìléi 01.01.2011 / 14:32

2 respostas

6

O sinal de menos é ignorado na primeira passagem. Portanto, a primeira passagem classifica 1 , 11 , 1a , 11a . Desde 1 < a , você recebe 11a < 1a e, portanto, 11-a < 1-a .

- é um elemento de agrupamento variável , o que significa que você / o implementador pode optar por ignorá-lo. A implementação do glibc aparentemente o faz. Na prática, a maioria da pontuação é afetada por esse comportamento.

Você pode ler os detalhes do Algoritmo de Ordenação Unicode , modulo como a glibc o implementa.

    
por 02.01.2011 / 16:53
0

Como explicado por Peter Eisentraut, isso ocorre porque o algoritmo de classificação do Unicode ignora - ao classificar.

A única maneira de contornar isso é definir sua própria localidade, com diferentes agrupamentos (regras de classificação). Isto é no entanto bastante não trivial. Além disso, ele forneceria um sistema com regras de classificação incomuns, que podem causar problemas com outro software.

Então, realisticamente, você terá que mudar sua localidade para ASCII (se você não precisa de caracteres Unicode), ou ordenar usando um programa onde você pode configurar as regras de classificação diretamente.

    
por 19.01.2011 / 03:59