Comment get un sorting unix à sortinger dans le même ordre que Java (par valeur unicode)

Je décompresse le sorting vers la command Unix dans un programme Java que j'ai écrit. Cependant, j'ai des problèmes résultant de la comparaison de string de Java se comporter différemment des comparaisons faites par type.

Depuis le [Java Doc] [1]:

Compare deux strings lexicographiquement. La comparaison est basée sur la valeur Unicode de chaque caractère dans les strings.

De la page man de type:

* ATTENTION * Les parameters régionaux spécifiés par l'environnement affectent l'ordre de sorting. Définissez LC_ALL = C pour get l'ordre de sorting traditionnel qui utilise les valeurs d'octets natifs.

Donc, mon estimation est nécessaire de sortinger avec LC_ALL = C. Cependant, j'ai toujours pensé que cela voulait dire sorting basé sur la valeur ASCII, ce qui signifie qui sait ce qui pourrait arriver avec unicode.

La catégorie locale LC_COLLATE contrôle l'ordre de sorting. LC_ALL définit toutes les catégories.

Avec LC_COLLATE=C , les strings sont sortingées byte by byte. Les octets ne doivent pas nécessairement être des caractères ASCII (seules les valeurs d'octets entre 0 et 127 sont ASCII). Sur un système unix, Unicode est presque toujours codé en UTF-8 . UTF-8 a la propriété que le encoding des caractères en tant que séquences d'octets préserve leur ordre, et donc le sorting des strings UTF-8 dans l'ordre lexicographique des octets équivaut à les sortinger dans l'ordre lexicographique des caractères. Par conséquent, LC_COLLATE=C est approprié pour sortinger Unicode codé en UTF-8 lexicographiquement en fonction des valeurs de caractères.

Notez que Java ne sortinge pas réellement en fonction des valeurs de caractères Unicode mais en fonction de leur enencoding UTF-16. Cela fait une différence avec les paires de substitution , c'est à dire si vous avez des points de code au-dessus de 65535.

Ni le sorting par représentation d'octets UTF-8, ni le sorting par Java, ni l'utilitaire de sort dans un environnement local UTF-8 sur GNU / Linux ne prennent en count les caractères combinés , par exemple sortingés différemment de á (U + 00E1 LETTRE MINUSCULE LATINE A AVEC AIGUILLE) (dans un environnement UTF-8, les deux finissent par équivaloir à a dans la première passe mais la seconde passe sortinge par sharepoint code).