Encodage UTF-8 et applications web

Après plusieurs heures passées à trouver mon erreur d’encodage UTF-8, voici un petite liste des points à vérifier sur une application web.

Mon environnement :

MySQL

Vérifier que les tables et les champs textes utilisent le charset UTF-8 :

CREATE TABLE [...] DEFAULT CHARSET=utf8;

Hibernate

hibernate.cfg.xml

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.useUnicode">true</property>
    <property name="hibernate.connection.characterEncoding">utf-8</property>
  </session-factory>
</hibernate-configuration>

Spring framework

Utilisez le servlet filter CharacterEncodingFilter dans le web.xml afin de forcer l’encodage. Attention de bien positionner ce filtre en première position dans la liste des différents filtres!

web.xml

<web-app>
  <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>
</web-app>

Velocity et mails

Lors du load des templates Velocity, spécifier l’encodage UTF-8:

String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, fileName, "UTF-8", tokens);

Encoder aussi les mails. Dans mon cas avec MimeMessageHelper:

MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

JSP

Définir l’encodage des JSP.

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

Tomcat

Si après tout ça vous avez encore des problèmes, vous pouvez toujours essayer de configurer Tomcat mais je pense que ça ne changera pas grand chose…

server.xml

<Server>
  <Service>
    <Connector URIEncoding="UTF-8" useBodyEncodingForURI="true" [...] />
  </Service>
</Server>

Conclusion

Tous ces points ne sont surement pas nécessaire… il faut que je vérifie. Je pense que l’encodage au niveau de la base de données, du web.xml et des mails (Velocity et MimeMessage) est suffisant mais cette liste peut ammener des indices à d’autres qui rencontrent ce genre de problèmes…

Dans mon cas, le problème venait du servlet filter d’encodage de Spring : il n’était pas en première position :-(



blog comments powered by Disqus