2010-11-28 23 views
0

Je rencontre quelques problèmes avec l'encodage des données dans la page JSP (j'utilise un Spring-MVC). Il ressemble à ceci:Problème d'encodage de page jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<% 
    response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1 
    response.setHeader("Pragma", "no-cache"); //HTTP 1.0 
    response.setDateHeader("Expires", 0); 
    response.setCharacterEncoding("UTF-8"); 
    request.setCharacterEncoding("UTF-8"); 
%> 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 

..... 
<form method="post">    
     <input type="text" name="txt" value="${Name}" /> 
     <input type="submit" value= OK /> 
</form> 

........ 

Mon application prend un texte d'une zone de saisie de texte et d'écriture à la base de données (HSQLDB). Quand j'utilise des lettres anglaises pour écrire des données, tout fonctionne bien! Mais quand j'essaye d'employer des lettres russes dans la zone de texte d'entrée, il écrivent quelques lettres étranges sous la forme d'encodage incorrecte. Comment éviter ce problème?

Des idées?

+1

Votre entrée 'Cache-Control' est par ailleurs incomplète (http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all- navigateurs/2068407 # 2068407). Cela ne marchera pas dans Firefox, entre autres. De plus, les deux appels de 'setCharacterEncoding()' sont superflus car il est trop tard pour le 'request' et vous avez déjà défini le' pageEncoding' qui fait déjà implicitement le 'response'. – BalusC

+0

Oh ... je ne savais pas à ce sujet. Ainsi, je peux enlever des lignes response.setCharacterEncoding ("UTF-8"); request.setCharacterEncoding ("UTF-8"); ? J'ai essayé de mettre cette ligne ici pour résoudre les problèmes d'encodage. Mais tout n'a pas fonctionné, jusqu'à ce que axtavt ne me donne pas une solution avec le filtre d'encodage Spring. – Ilnur

+1

Comme dit, il est trop tard * pour le mettre sur la demande. Il a déjà été traité (JSP fait partie de la réponse). Il doit arriver * avant * le traitement des demandes et un 'Filter' est le seul endroit approprié pour faire le travail. Pour la réponse, c'est juste une duplication puisque le 'pageEncoding =" UTF-8 "' fait déjà exactement cela sous les couvertures. En passant, la définition des en-têtes de réponse devrait de préférence également se produire dans un filtre. Cela garde vos JSP libres de tout encombrement de duplication de code. Voir aussi [Comment éviter le code Java dans JSP?] (Http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files). – BalusC

Répondre

5

Vous devez configurer le filtre de codage de caractères dans web.xml:

<filter> 
    <filter-name>charsetEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 

    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>charsetEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

conteneur Servlet traite des données POST demande comme ISO-8859-1 si le codage de la requête est non spécifié, alors que le navigateur envoie le formulaire dans le codage de la page (UTF-8 dans votre cas) et ne spécifie pas l'encodage de manière non régulière, vous avez donc besoin d'un filtre pour spécifier le codage de requête approprié.

EDIT: Comme mentionné correctement par BalusC, il ne couvre pas les problèmes de codage avec les requêtes GET. Pour corriger cela sur Tomcat, vous devez définir URIEncoding="UTF-8" sur <Connector> dans conf/server.xml.

+2

Un bon conseil pour les utilisateurs Spring, mais noté devrait être que cela ne couvre que les demandes POST, pas les demandes GET. C'est en passant un [filtre simple] (http://kickjava.com/src/org/springframework/web/filter/CharacterEncodingFilter.java.htm). Tout ce qu'il fait fondamentalement est 'request.setCharacterEncoding()' si 'request.getCharacterEncoding()' renvoie null. – BalusC

+0

Super !!! Merci beaucoup, axtavt! J'ai essayé de le résoudre en configurant les paramètres Tomcat, mais tout ne m'aide pas. – Ilnur

+1

Tout paramètre que Tomcat propose pour le codage de la requête concerne les requêtes GET, pas les requêtes POST (l'attribut 'URIEncoding' de l'élément HTTP' '). – BalusC