[java] Comparaison de string

Bonjour,

J’ai un petit souci de comparaison de chaine dans un logiciel qui utilise java indirectement dans des <% %>. Je précise que j’ai regardé sur internet et que j’ai trouvé plein de sujet parlant de ce souci en vain, et que je ne connais pour ainsi dire pas java.

Pourquoi la constante « DEVELOPPEMENT » n’est pas égale à la fonction renvoyant « DEVELOPPEMENT » ? J’ai cru lire qu’il y avait de l’unicode là dedans et que equals ou CompareTo ont un comportement bizarre mais je n’arrive à rien. Pour info c’est dans ODI.

<%
constante1="DEVELOPPEMENT";
constante2=odiRef.getContext("CTX_CODE");
String var1 = new String ( constante1.getBytes(), "UTF-8" );
String var2 = new String ( constante2.getBytes(), "UTF-8" );
  %>
select  '+<%=var1.equals(var2)%>+'

renvoit false !! et var1.equals(var2) aussi qui m’a conduit à cette recherche sur les unicodes.

Please aidez moi à comparer ces 2 chaines pourtant identiques !. :slight_smile:

Je suis déçu !

Oh chouette Dredi en avance et non ! :’(

Putain, je suis tellement rouillé en Java que ça me donne envie de pleurer…

Déjà, pour moi tu devrais directement assigner tes valeurs à une nouvelle String, sans passer par tes “constante1” et 2.

.equals non ?
Ou sinon tu as la methode string compare dans mes souvenirs.

String s = "[i]something[/i]", t = "[i]maybe something else[/i]";
if (s == t)      // Legal, but usually WRONG.
if (s.equals(t)) // RIGHT
if (s > t)    // ILLEGAL
if (s.compareTo(t) > 0) // CORRECT>

Bussiere
Knock knock ?
Who’s there ?
_
_
_
_
_
_
_
_
_
_
_
_
_
Java …

Je ne voudrais pas dire de connerie mais je crois que compareTo retourne 0 si les 2 strings sont identiques.
Ca retourne -1 si ça n’est pas identique et une valeur > 0 si une des String est “contenue” dans l’autre ou un truc comme ça…

Sinon il y a equalsIgnoreCase qui retourne plus simplement true ou false…

Ben déjà les length sont différents: celle de la constante fait 13 et celle résultant de la fonction fait 35. Donc c’est au moins codé sur un nombre d’octets différents. C’est pour cela et ce que j’ai vu sur internet que je suis allé vers les conversions UTF-8.

bouge pas.

Alors essaie avec :
var2.toString().equals et var2.toString().compareTO
et essaie avec var2.hashcode() compare les hashcode.

d’apres ton code je suppose que le type de constante2 c’est String.
pour constante1, j’en ai aucune idee. si c’est pas une String, il faut probablement pas chercher plus loin.
que te retourne un constante2.getClass() ?

Pour ce qui est de l’encodage, d’apres la spec, toutes les Strings sont codees en UTF16 (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html)

t’as tente un constante2.trim() ? Si ca se trouve le probleme est aussi simple que des espaces en trop…

Au pif, je me demande si tes constantes sont de types string, ou si elles sont pas plutot “object” (je dis ca completement au pif). PIF !

heu string.Length te renvoit le nombre de caractere, rien à voir avec l’encodage. Donc celle qui fait 35 n’est pas une string. A mon avis, tu compares des pommes et des poires.

Tu devrais caster le tout en string encore une fois histoire d’être sûr

((String)var2).toString().equals(((String)var1).toString())

On est jamais trop prudent de nos jour. Sinon, un coup de debug c’est faisable ?

Petit joueur :stuck_out_tongue: :

(boolean((String)var2).toString().equals(((String)var1).toString()))

Le truc c’est que si ce sont des objets ca peut devenir des strings.
Apres voila :stuck_out_tongue:
Bussiere

L’est foireux ton cast.

Ca c’est un cast foireux:

C est un image foireuse.

J’ai essayé le toString(), le trim() qui affichent bien ce que je veux mais ça fait toujours 35 caractères.
Le getClass me donne bien class java.lang.String

Pour length() il ne donne pas le nombre de caractère mais le nombre d’unité de code Unicode dans la chaine :stuck_out_tongue: .
Par contre j’ai une suprise quand j’affiche charAt(0) à 35: j’obtiens "< ? = s n p R e f . g e t C o n t e x t ( " C T X _ C O D E " ) ? >, c’est-à-dire le nom de la même fonction, avec des espaces, mais avec la class de l’ancien éditeur à savoir snpRef (sunopsis réference). !!??

Et pourtant quand je l’affiche par <%=constante2%> je vois bien « DEVELOPPEMENT ». En *.js ça marche pourtant les substitutions avec <%%>?! Bon là on est en ODI mais c’est a priori le même principe.

PS: gargl!, rien à voir, y’a comme utilisateurs qui lisent le sujet : phili_b, Ivru, [b]Facebook /b. Je connaissais d’autres bots google évidemment mais celui là me surprend.

Bussière:
String s = “blabla”;
String y = “blabla2”;

s == y compare les adresses mémoires. Ca ne renverra true que si tu fais s = y avant.

s.equals(y) est la facon correcte de comparer le contenu des strings.

Pour autant, je ne suis pas convaincu que ce soit java qui soit en faute mais plutot l’intégration de java dans … euh… ton autre outil.

<% constante1="DEVELOPPEMENT"; constante2=odiRef.getContext("CTX_CODE"); String var1 = new String ( constante1.getBytes(), "UTF-8" ); String var2 = new String ( constante2.getBytes(), "UTF-8" ); boolean result = var1.equals(var2); %> select '+<%=result%>+'

Peux tu mettre un breakpoint sur la ligne boolean result = … , lancer, executer la ligne et regarder la valeur dans result ? Ca permettra de certifier que c’est java qui pose probleme.
Aussi, les variables créées dans une zone <% %> ont elles la portée suffisante pour etre lisibles dans un autre bloc <% %> ?

[quote=“Berzehk, post:17, topic: 53559”]
Peux tu mettre un breakpoint sur la ligne boolean result = … , lancer, executer la ligne et regarder la valeur dans result ? [/quote]
Des breakpoints ? Pas possible dans mon outil.

[quote=“Berzehk, post:17, topic: 53559”]
Aussi, les variables créées dans une zone <% %> ont elles la portée suffisante pour etre lisibles dans un autre bloc <% %> ?[/quote]

Je n’y crois pas trop vu que j’arrive à afficher la donnée dans un autre, mais j’essayerais quand même ta solution.

C’est pas en forçant ton constructeur à croire que c’est de l’UTF-8 que ça va le devenir par magie la chaîne de bytes que tu lui passes. Connais l’encodage renvoyé par getContext(String) et passe le bon format au constructeur de la String. Ensuite tu fais un equals, et pas un == qui est faux.

Edit: ça serait plutôt de l’UTF-16 ton truc ? Parce que si quand tu forces le print tu vois des caractères séparés par des espaces, ça sent le truc codé sur 2 fois le nombre de bytes.

Tain c’est quoi ces images qui marchent pas…