web-dev-qa-db-fra.com

Spring MVC UTF-8 Encodage

En ce moment, j'essaie de démarrer avec Spring MVC. En essayant des choses, j'ai rencontré un problème d'encodage.

Je souhaite afficher les caractères UTF-8 sur mes pages JSP, j'ai donc ajouté une chaîne contenant des caractères UTF-8 à ModelAndView. Cela ressemble à ceci:

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value="/", method=RequestMethod.GET)
    public ModelAndView home() {
        logger.info("Welcome home!");
        return new ModelAndView("home", "utftest", "ölm");
    }

}

Sur la page JSP, je veux juste afficher la chaîne avec les caractères UTF-8 comme ceci:

<%@ page language="Java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Home</title>
</head>
<body>
    <h1>Hello world!</h1>
    <p><c:out value="ö" /></p>
    <p><c:out value="${utftest}"></c:out></p>
</body>
</html>

En conséquence, je reçois les suivants:

Hello world!

ö

ölm

Notez que le code suivant <c:out value="ö" /> était affiché sans erreur de codage. J'ai également défini le codage par défaut sur UTF-8 dans Springsource Tool Suite, mais je reçois toujours de mauvais caractères.

Edit:

J'aurais peut-être dû mentionner que j'utilise un Mac avec OS X 10.6. Pour le développement Spring, j'utilise la suite d'outils Springsource de Spring (http://www.springsource.com/developer/sts). J'espère que cela aide à découvrir ce qui ne va pas avec mon réglage.

Edit 2:

Grâce à McDwell, je viens d'essayer d'utiliser "\u00f6lm" au lieu de "ölm" dans mon contrôleur et le problème d’encodage sur la page JSP a disparu.

Est-ce que cela signifie que mes fichiers .Java sont codés avec un mauvais jeu de caractères? Où puis-je changer cela dans Eclipse?

Merci.

59
OemerA

Ok les gars, j'ai trouvé la raison de mon problème d'encodage.

La faute était dans mon processus de construction. Je n'ai pas dit Maven dans mon pom.xml fichier pour construire le projet avec le codage UTF-8. Maven vient donc de prendre le codage par défaut de mon système, MacRoman, et de le construire avec le codage MacRoman.

Heureusement, Maven vous en avertit lors de la construction de votre projet (MAIS il y a de bonnes chances que l'avertissement disparaisse trop rapidement de votre écran à cause de tous les autres messages).

Voici la propriété que vous devez définir dans le pom.xml fichier:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

Merci beaucoup pour votre aide. Sans vous, je ne saurais pas le savoir!

38
OemerA

Assurez-vous d'enregistrer Spring CharacterEncodingFilter dans votre web.xml _ (doit être le premier filtre de ce fichier).

<filter>  
    <filter-name>encodingFilter</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>  
    <init-param>  
       <param-name>forceEncoding</param-name>  
       <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>encodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

Si vous êtes sur Tomcat, vous n'avez peut-être pas défini le URIEncoding dans votre server.xml. Si vous ne le définissez pas sur UTF-8, cela ne fonctionnera pas. Gardez certainement le CharacterEncodingFilter. Néanmoins, voici une liste concise liste de contrôle à suivre. Cela vous guidera certainement pour faire ce travail.

119

En plus de la réponse de Benjamin (que je n'ai qu'écrémée), vous devez vous assurer que vos fichiers sont réellement stockés en utilisant le codage approprié (UTF-8 pour le code source, les JSP, etc.), mais notez que Java doivent être codés au format ISO 8859-1 par définition).

Le problème avec ceci est qu'il n'est pas possible de dire quel encodage a été utilisé pour stocker un fichier. Votre seule option consiste à ouvrir le fichier en utilisant un encodage spécifique et en vérifiant si le contenu a un sens ou non. Vous pouvez également essayer de convertir le fichier du codage supposé en codage souhaité à l'aide de iconv. Si cela génère une erreur, votre hypothèse est incorrecte. Donc, si vous supposez que hello.jsp est codé en UTF-8, exécutez "iconv -f UTF-16 -t UTF-8 hello.jsp" et recherchez les erreurs éventuelles.

Si vous découvrez que vos fichiers ne sont pas correctement codés, vous devez savoir pourquoi. C'est probablement l'éditeur ou IDE vous avez utilisé pour créer le fichier. Dans le cas d'Eclipse (et STS), assurez-vous que le codage de fichier texte (Préférences/Général/Espace de travail) est défini sur UTF-8 (Malheureusement, le codage de la plate-forme de votre système est malheureusement utilisé par défaut).

Ce qui rend les problèmes d’encodage si difficiles à déboguer, c’est le grand nombre de composants impliqués (éditeur de texte, éditeur, ainsi que chacun des composants logiciels intermédiaires, y compris dans certains cas une base de données), et chacun d’eux peut introduire une erreur.

14
otto.poellath

En plus de la réponse de Benjamin - au cas où vous utiliseriez Spring Security , placer CharacterEncodingFilter dans web.xml pourrait ne pas toujours fonctionner. Dans ce cas, vous devez créer un filtre personnalisé et l'ajouter à la chaîne de filtres en tant que premier filtre. Pour vous assurer qu'il s'agit du premier filtre de la chaîne, vous devez l'ajouter avant ChannelProcessingFilter, en utilisant addFilterBefore dans votre WebSecurityConfigurerAdapter:

@Configuration
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //add your custom encoding filter as the first filter in the chain
        http.addFilterBefore(new EncodingFilter(), ChannelProcessingFilter.class);

        http.authorizeRequests()
            .and()
            // your code here ...
    }
}

L'ordre de tous les filtres dans Spring Security est disponible ici: HttpSecurityBuilder - addFilter ()

Votre filtre de codage UTF-8 personnalisé peut se présenter comme suit:

public class EncodingFilter extends GenericFilterBean {

    @Override
    public void doFilter(
            ServletRequest request, 
            ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        chain.doFilter(request, response);
    }
}

N'oubliez pas d'ajouter dans vos fichiers jsp:

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

Et supprimez CharacterEncodingFilter du fichier web.xml s’il existe.

9
Alexey

La solution la plus simple pour forcer le codage UTF-8 dans Spring MVC renvoyé String:

Dans @RequestMapping, utilisation:

produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8"
6
Alex R

faites un clic droit sur votre controller.Java, puis sur les propriétés et vérifiez si votre fichier texte est codé avec utf-8, sinon c'est votre erreur.

4
storm_buster

Pour résoudre ce problème, vous devez suivre les trois étapes suivantes:

  1. Définissez le codage de page sur UTF-8 comme ci-dessous:

    <%@ page language="Java" pageEncoding="UTF-8"%>
    <%@ page contentType="text/html;charset=UTF-8" %>
    
  2. Définissez le filtre dans le fichier web.xml comme suit:

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  3. Définissez le codage des ressources sur UTF-8, si vous écrivez des caractères UTF-8 dans le code Java ou directement dans JSP).

4
user7373275

Selon le rendu de votre vue, vous aurez peut-être également besoin de:

@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
    return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
3
Axel Fontaine

A travaillé pour moi comme ici Spring MVC Java config

par ajouté à l'initialisateur Web

 @Override
      protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
      }
0
d0wn