Ich fand, dass das Sortierergebnis in ASCII:
Quelldatei test
:
1-
11-
1-a
11-a
Nach ASCII sortieren:
$ LANG=en_US.ascii sort test
1-
1-a
11-
11-a
Und mit UTF-8:
$ LANG=en_US.utf8 sort test
1-
11-
11-a
1-a
Ich finde, es ist so kontrapunktisch und es ist keine Reihenfolge der Wörterbücher.
Ist der Charakter nicht "-" ( 002d
) ist dann immer weniger [0-9]
( 0030-0039
)
Was ist die allgemeine Regel in der UTF-8-Kollatierung?
Und wie man das umgehen kann, einfach machen -
dann weniger sein [0-9]
während andere Zeichen für UTF-8 unter Linux unverändert bleiben? (So kann es das Ergebnis beeinflussen ls --sort
. sort
, usw. )
sort
8.5 von GNU coreutils, "1-" steht immer vor "11-", mit einem beliebigen Gebietsschema.Antworten:
Das Minuszeichen wird im ersten Durchgang ignoriert. Der erste Durchgang sortiert also
1
.11
.1a
.11a
. Schon seit1
& lt;a
, du kriegst11a
& lt;1a
und somit11-a
& lt;1-a
.-
ist ein variables Sortierelement bedeutet, dass Sie / der Implementierer es ignorieren können. Die glibc-Implementierung tut dies anscheinend. In der Praxis ist die meiste Interpunktion von diesem Verhalten betroffen.Sie können sich über die blutigen Details in der Unicode-Sortierungsalgorithmus , modulo wie glibc es implementiert.
quelle
Wie Peter Eisentraut erklärt hat, liegt dies daran, dass der Sortieralgorithmus für Unicode ignoriert wird
-
beim SortierenDer einzige Weg, dies zu umgehen, besteht darin, ein eigenes Gebietsschema mit einer anderen Sortierung (Sortierregeln) zu definieren. Dies ist jedoch nicht trivial. Außerdem erhalten Sie ein System mit ungewöhnlichen Sortierregeln, das Probleme mit anderer Software verursachen kann.
Realistisch gesehen müssen Sie entweder Ihr Gebietsschema auf ASCII umstellen (wenn Sie kein Unicode-Zeichen benötigen) oder mithilfe eines Programms sortieren, in dem Sie die Sortierregeln direkt konfigurieren können.
quelle