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.
.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>
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.
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() ?
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.
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 .
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.