Help - Search - Member List - Calendar
Full Version: [java] Urldecoder.decode(zob,"utf-8")
OpenSpace > Zone Ordinateurs > Programmation
PoP
J'ai le code suivant:
CODE

import java.net.URLDecoder;
   (...)
   HashMap paramtemp = new HashMap();
   Set paramNames = param.keySet();
   Iterator namesIt = paramNames.iterator();
  while (namesIt.hasNext()) {
     String paramName = (String)namesIt.next();
     String paramValue = (String)param.get(paramName);
     System.out.println("###### INPUT paramName" + paramName);
     System.out.println("###### INPUT paramValue" + paramValue);
     paramName = URLDecoder.decode(paramName, "UTF-8");
     paramValue = URLDecoder.decode(paramValue, "UTF-8");
     System.out.println("###### OUTPUT paramName" + paramName);
     System.out.println("###### OUTPUT paramValue" + paramValue);
     paramtemp.put(paramName, paramValue);
   }
   param = paramtemp;
   (...)


param est une HashMap définie précédemment dans mon code précédemment. Ce bout de code est destiné à décoder le contenu de cette hashmap.
Ce qui pose problème dans ce bout de code, c'est URLDecoder.decode. Pour une raison que je n'arrive pas à comprendre, ceci ne décode...rien. Voici le résultat de l'exécution de mon code :
CODE

###### INPUT paramName GA
###### INPUT paramValue test
###### OUTPUT paramName GA
###### OUTPUT paramValue test
###### INPUT paramName BU
###### INPUT paramValue tr�s gros éléphant
###### OUTPUT paramName BU
###### OUTPUT paramValue tr�s gros éléphant
###### INPUT paramName ZO
###### INPUT paramValue shadock
###### OUTPUT paramName ZO
###### OUTPUT paramValue shadock


On le voit clairement, le "très gros éléphant" encodé en UTF-8 sort toujours encodé en UTF-8.
Ma question est-donc, comment obtenir en sortie un décodage UTF-8?



momo
http://java.sun.com/j2se/1.4.2/docs/api/ja...va.lang.String)
ben d'après, ça , ce serai parceque ton texte d'entré n'obéit pas à l'encodage %+code caractère ?
PoP
Je sais pas, depuis 14h j'arrive plus à accéder au site de sun. Le proxy de la boite doit manquer de ciboulette.
Toujours est-il qu'en procédant de la sorte:
CODE

     paramName = new String(paramName.getBytes(),"UTF-8");
     paramValue = new String(paramValue.getBytes(),"UTF-8");


J'obtiens en sortie:
CODE

###### INPUT paramName BU
###### INPUT paramValue tr�s gros éléphant
###### OUTPUT paramName BU
###### OUTPUT paramValue tr??s gros éléphant


Le "très" n'est pas décodé correctement
PoP
Bon, pour tester mon code, j'ai un petit bout de php qui me fait ça:
CODE

<html>
       <body>
               <form action="http://462.462.462.462:462/connard" method="post">
                       <input type="hidden" name="ZO" value="shadock">
                       <input type="hidden" name="GA" value="test">
                       <input type="hidden" name="BU" value="<?php echo utf8_encode("E éèê A àâä I ïî O ôö U ùüû"); ?>">
                       <input type="submit">
               </form>
       </body>
</html>


Dans un browser web tout bête (mozilla) j'ai juste à cliquer sur mon chtit bouton et hop, j'obtiens mes traces suivantes:
CODE

###### INPUT paramName BU
###### INPUT paramValue E é�ê A à â� I ïî O �ö U ù�û
###### OUTPUT paramName BU
###### OUTPUT paramValue E é??ê A àâ?? I ïî O ??ö U ù??û


C'est étrange comme tous les caractères ne sont pas décodés correctement. J'en viens même à me demander s'ils sont encodés correctement...
PoP
L'encodage est-il fiable? En d'autres mots, ce que je fournis à ma servlet est-il bien encodé en UTF-8?

J'ai mis ce petit bout de code dans ma servlet, pour voir...
CODE

   String test_source= "E éèêë A àâä I ïî O ôö U ùüû";
System.out.println("Chaine avec les accents: " + test_source);
   String test_URLEncoder = URLEncoder.encode(test_source, "UTF-8");
System.out.println("Chaine encodée avec URLEncoder: " + test_URLEncoder);
   String test_String = new String(test_URLEncoder.getBytes(),"UTF-8");
System.out.println("Chaine décodée avec String: " + test_String);
     String test_URLDecoder = URLDecoder.decode(test_URLEncoder,"UTF-8");
System.out.println("Chaine décodée avec URLDecoder: " + test_URLDecoder);


Et voici ce qu'il en résulte:
CODE

Chaine avec les accents: E éèêë A àâä I ïî O ôö U ùüû
Chaine encodée avec URLEncoder: E+%C3%A9%C3%A8%C3%AA%C3%AB+A+%C3%A0%C3%A2%C3%A4+I+%C3%AF%C3%AE+O+%C3%
B4%C3%B6+U+%C3%B9%C3%BC%C3%BB
Chaine décodée avec String: E+%C3%A9%C3%A8%C3%AA%C3%AB+A+%C3%A0%C3%A2%C3%A4+I+%C3%AF%C3%AE+O+%C3%
B4%C3%B6+U+%C3%B9%C3%BC%C3%B
B
Chaine décodée avec URLDecoder: E éèêë A àâä I ïî O ôö U ùüû


J'en conclue que ce que je lui fournissait en entrée à sortie de script php n'est pas de l'utf-8. Mais pourtant, j'utilise bien la fonction utf8_encode, alors où est le problème?
Serait-ce le fruit de l'interaction de l'encodage de mon browser via lequel je fais la requête vers ma servlet?
Quand je regarde le source du formulaire généré par test.php dans Mozilla, la chaine de caractère est
CODE
E éèêë A à âä I ïî O ôö U ùüû
. Par contre quand je fait la même chose sous Internet Explorer, j'obtiens...
CODE
E éèêë A àâä I ïî O ôö U ùüû
...comment être sur de ce que j'envois à ma servlet?!
Et le plus drôle dans l'histoire, c'est que mon script php est destiné à reproduire le comportement d'un browser vxml...que je n'ai pas. Super youpi chouette.
Gfx, t'as pas une idée toi l'être malsain du Java?



Gfx
Je peux juste te dire que j'ai énormément d'emmerdes d'UTF8 avec PHP. Entre deux versions différentes les comportements ne sont pas les mêmes (#ProgX a des soucis à cause de ça entre ma version locale et celle d'OVH). Qui plus est, quand tu forces les ISO-8859-1 dans les XML/XSLT il s'en fout ou fait de l'UTF8 fonfon (donc pas parfait) un peu quand il veut sad.gif
PoP
sad.gif
Solution partielle : je vais passer tout l'après-midi chez le client à chercher avec les conditions réelles ce que je peux faire.
Je ferai part de la solution trouvée.
PoP
Problème résolu. Ouf.
Ici on apprend que
QUOTE

when the HttpServletRequest.getParameter() API is called, all data of the input text is decoded and the decoded input is converted from ISO-8859-1 to UTF-16 and returned as a Java string.


En clair, il faut remettre dans sa forme original la chaine reçu pour ensuite la décoder en UTF-8 ainsi
CODE

paramName = new String(paramName.getBytes("ISO8859_1"), "UTF8");

pour que le décodage soit réalisé correctement.



Gfx
Heu ouais sinon tu peux décoder directement le UTF-16 smile.gif)) Remarque ça expliqeu des choses, car décoder du UTF-16 avec l'algo UTF-8... smile.gif
PoP
QUOTE (Gfx @ 04/03/2004 12:05)
Heu ouais sinon tu peux décoder directement le UTF-16 smile.gif))

Bah non, parce que dans les specs du browser qui m'envoit ce que je trampoline, c'est stipulé que c'est de l'UTF-8. Et comme on est dans un contexte "La spec fait état de Loi", on va gentillement s'y conformer!
Sinon décoder de l'UTF-16 avec l'algo UTF-8, ça fait que des grumeaux!
Peter Pan
Hé hé moi c'est quand je me sers de la barre d'URL pour faire une recherche Google dans Firebird, il converti pas les accents ce niais smile.gif
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2024 Invision Power Services, Inc.