web-dev-qa-db-fra.com

HttpServletRequest UTF-8 Encoding

Je veux obtenir mes paramètres de la requête (caractères avec accents) mais cela ne fonctionne pas. J'ai essayé d'utiliser request.setCharacterEncoding( "UTF-8" ) mais cela n'a pas fonctionné non plus.

Je sais que URLDecoder.decode( request.getQueryString(), "UTF-8" ) me renvoie les caractères de droits mais request.getParameterValues() ne fonctionne pas! Est-ce que quelqu'un a une idée ?

36
Carvallegro

La suggestion de Paul semble être la meilleure solution, mais si vous voulez y remédier, vous n'avez pas du tout besoin d'URLEncoder ou d'URLDecoder:

String item = request.getParameter("param"); 

byte[] bytes = item.getBytes(StandardCharsets.ISO_8859_1);
item = new String(bytes, StandardCharsets.UTF_8);

// Java 6:
// byte[] bytes = item.getBytes("ISO-8859-1");
// item = new String(bytes, "UTF-8");

pdate: Étant donné que cela obtient beaucoup de votes, je tiens à souligner le point de BalusC que ce n'est certainement pas une solution; c'est au mieux une solution de contournement. Les gens ne devraient pas faire ça.

Je ne sais pas exactement ce qui a causé le problème d'origine, mais je soupçonne que l'URL était déjà encodée en UTF-8, puis a été encodée à nouveau en UTF-8.

39
VGR

Si vous utilisez Apache Tomcat, request.setCharacterEncoding("UTF-8") ne fonctionne qu'avec la requête POST.

Pour la demande GET, vous devez ajouter URIEncoding="UTF-8" Sur ton <Connector> dans server.xml.

Voir plus dans FAQ/CharacterEncoding - Espace wiki Apache Tomcat .

26
Paul Vargas

Eh bien, j'ai trouvé un moyen de résoudre mon problème, je suppose que ce n'est pas la meilleure solution, mais ça marche ..

  String item = request.getParameterValues("param"); // Hélène
  item = URLEncoder.encode( model.getNameItem(), "ISO-8859-1" ); // H%C3%A9l%C3%A8ne
  item = URLDecoder.decode( item, "UTF-8" ); // and finally : Hélène

Si cela peut aider quelqu'un d'autre, je suis heureux de vous aider :)

PS: Paul, je ne vous ai pas répondu plus tôt mais j'ai déjà fait ces choses. Merci quand même pour votre aide.

6
Carvallegro