en Java, comment les cordes Unicode sont-elles comparées?
Ce que je veux dire, c'est que si j'ai quelques dises, des chaînes japonaises, lorsque je fais ce qui suit: p>
3 Réponses :
selon compare deux cordes
lexicographiquement. La comparaison est basée sur la valeur Unicode de chaque personnage de
Les cordes. La séquence de caractères représentée par cette
p>
blockQuote> comparèteo code> méthode de la classe de chaîne. Voir le Javadoc : p>
chaîne code> est comparé lexicographiquement à la
Séquence de caractères représentée par la chaîne d'argumentation. Le résultat est
un entier négatif si ce
chaîne code> objet
lexicographique précède la chaîne d'argumentation. Le résultat est un
Entier positif si ce
chaîne code> objet
lexicographiquement
suit la chaîne d'argumentation. Le résultat est zéro si les cordes
sont égaux;
comparèteo code> retours
0 code> exactement quand
La méthode {@link #equals (objet)} retournerait
true code>.
Cela ressemble à son ancien verbiage du mauvais jour de l'UCS-2.
Par défaut, il est dans la comparaison de code octet UTF-16. C'est la voie la plus rapide, et donc parfait si tout ce dont vous avez besoin est Si vous avez besoin d'une commande sensible à un utilisateur dans une locale donnée, utilisez la classe Java.Text.Collator. P>
La classe JTCollator ne respecte pas le Unicode Collation Algorithme . Utiliser la vraie chose.
@Tchrist Y a-t-il un bon soutien pour l'UCA maintenant, avec beaucoup de locaux soutenus? La dernière fois que j'ai réellement utilisé Java, l'UCA était assez nouvelle, alors je sais que beaucoup a changé depuis (pourquoi je ne réponds que rarement des questions Java, à ceux que je sais que je peux dire quelque chose de significatif).
Jon, la classe Collateur JDK est toujours pas b> Implémente l'UCA, mais L'ICU fait. Je trouve que l'UCA est généralement exactement ce que je veux, sans même de locaux spéciaux, mais l'ICU utilise également les données CLDR pour son activité locale si vous le souhaitez. J'utilise l'UCA pour tout mon texte Triée maintenant et cela a fait une grande différence.
@Tchrist, j'ai utilisé certaines des choses ICU pour C ++ il y a plusieurs fois et l'a trouvé très bien.
Par défaut, Strings trit lexicographiquement, par ordre unicode. L'ordre est de UTF-16, afin que ce soit exactement ce que vous voulez pour certains caractères, mais les caractères japonais sont tous dans le BMP , vous ne devriez donc pas avoir de problème avec ceux-ci. P>
Si vous souhaitez un ordre de tri différent, vous pouvez utiliser les classes java.text.collator code> pour définir un ordre de tri différent. P>
Donc, l'ordre «Unicode» est fondamentalement «point de code unicode ascendant»?
@RyAnprayogo: Oui. Pour être précis, il s'agit d'une valeur de caractère Java ascendant, qui, à cause de UTF-16, sont principalement mappées en une-à-une avec des points de code Unicode. À l'exception des caractères ci-dessus U + 10000, qui utilisent des caractères de substitution dans leur représentation.
"Unicode ordre" suit le Algorithme de collation Unicode . Vous parlez de quelque chose de différent. Et s'il vous plaît ne parlez pas de UTF-16; C'est un embarras massif et une douleur royale dans la postérieure. Essayer de traiter correctement avec unicode à Java est une torture d'acidité.
Merci, @tchrist. Vous avez raison, je ne voulais pas dire "ordre unicode". Je n'étais pas sûr de quoi l'appeler, car "ordre du point de code" serait également trompeur aussi. Peut-être juste "ordre de la valeur numérique des caractères".
BTW, je ne faisais pas de jugement sur UTF-16 :-). Bien que je fasse beaucoup de crédit à Java pour avoir apporté une version pratique d'UNICODE dans la langue, lorsque la plupart des langues ont toujours rendu très difficile de travailler avec un Unicode même rudimentaire. Même aujourd'hui, Java rend très simple de travailler avec le plus de texte, cependant, pour une utilisation spécialisée, vous devez savoir ce que vous faites. Je n'ai pas encore rencontré un bogue relatif à UTF-16 en Java.
@Avi: Vous voulez un bogue UTF-16 dans Java? Ok voici un: essayez de correspondre à trois points de code sur U + 010000 dans une classe de caractères dans une expression régulière. Mais un problème plus important est que toutes les interfaces sont vissues, en étant basé sur des unités de code 16 bits et non des caractères unicode. Donc, les gens confondent la longueur () pour CodePointCount () ou utilisent un caractère lorsque seul un Int est suffisamment grand pour contenir un caractère unicode. Un caractère n'est pas. Un char ne devrait jamais être utilisé pour tenir un personnage, car il n'est pas assez grand pour le faire.
Merci, Tom - Je n'étais pas au courant de cette question d'expression régulière. Je veux juste dire que i i> n'avait jamais rencontré un virus à cause de problèmes tels que celui-ci (et je travaille avec beaucoup de texte), et non que les bugs ne peuvent pas arriver. Vous avez certainement raison de la façon dont les caractères doivent être traités. En général, même si une mise en œuvre UTF-32 complète serait confuse pour les utilisateurs qui pensent que chaque unité correspondait à un caractère, à cause de choses comme combinant des caractères, des personnages de joignage, etc.
@Avi, alors que je trouve que la gestion des caractères logiques au lieu de formulaires de codage est à peu près préférable, vous êtes très correct que des objets tels que des graphèmes à point multi-code, des points de code invisibles et des points de code ignorables par défaut ont le potentiel d'un beaucoup de confusion. L'utilisateur final veut toujours toujours faire face aux graphèmes, non aux points de code et les programmeurs doivent être plutôt prudents de veiller à ce que tout fonctionne correctement.
Pour la défense de Java: les premières versions d'UNICODE étaient 16 bits. Lorsque Unicode 'Mise à niveau' à 32 bits Java avait un problème.