Archive pour le tag 'utf8'

Supprimer les accents UTF8 avec PHP

8 avril 2008

Il est souvent utile de supprimer les accents des caractères accentués dans une chaîne. Cette action est utilisée par exemple pour générer une URL propre ou bien un nom de fichier qui ne posera pas de problème.

En PHP, le développeur retrouve souvent la solution  suivante :

$str = strtr($str‘ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝ’‘AAAAAACEEEEEIIIINOOOOOUUUUY’);
$str = strtr($str‘áàâäãåçéèêëíìîïñóòôöõúùûüýÿ’‘aaaaaaceeeeiiiinooooouuuuyy’);

Ce bout de code fonctionne très bien en IS0-8859-1. Cependant, avec une chaîne en UTF8, des caractères étranges vont s’immiscer. Cela vient du fait que les caractères sont encodés sur 8 bits.

Après maintes essais avec iconv() et autres strtr(), je n’ai pas trouvé de solution à ce problème. Heureusement, Olivier Laviale a trouvé une astuce. Je ne suis pas convaincu que ce soit la méthode la plus performante, mais elle a le mérite de fonctionner :

$str = htmlentities($str, ENT_NOQUOTES, ‘utf-8′);     $str = preg_replace(‘#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#’‘\1′$str);
$str = preg_replace(‘#\&([A-za-z]{2})(?:lig)\;#’‘\1′$str);
$str = preg_replace(‘#\&[^;]+\;#’$str);

Je vous laisser consulter le billet original d’Olivier sur le sujet si vous souhaitez avoir plus d’informations.

Ah ! Les joies de l’encodage… :-)

Les bonnes pratiques avec Struts - afficher les formulaires en UTF-8

31 août 2006

Voici un troisième billet dans la série sur Les bonnes pratiques avec Struts.

Introduction

A partir du moment où une application doit être internationnalisée, il est intéressant d’utiliser l’encodage UTF-8 par défaut. Dès lors, un problème d’affichage des valeurs des formulaires se pose avec certains caractères[1].

Solutions

Il existe deux solutions courantes pour répondre à ce problème, qui s’implémentent :

  • dans les méthodes reset() et validate() de la classe ActionForm
  • avec des filtres des servlets

ActionForm.reset & ActionForm.validate

Il suffit simplement d’implémenter ces deux méthodes dans tous vos ActionForm :

public void reset(ActionMapping mapping, HttpServletRequest request) {
 	try {
 		request.setCharacterEncoding("UTF-8");
 	} catch (UnsupportedEncodingException e) {
 		e.printStackTrace();
 	}
 	super.reset(mapping, request);
 }
 public void validate(ActionMapping mapping, HttpServletRequest request) {
 	try {
 		request.setCharacterEncoding("UTF-8");
 	} catch (UnsupportedEncodingException e) {
 		e.printStackTrace();
 	}
 	super.validate(mapping, request);
 }

Cette méthode fonctionne bien. Mais elle pose deux problèmes :

  • Il faut implémenter ces méthodes dans tous les ActionForm. Ce problème peut être contourné par l’implémentation d’une classe de base BaseActionForm.
  • Le comportement des DynaActionForm n’est pas impacté par cette astuce.

Filtres de servlet

Il faut écrire un filtre de servlet qui va modifier l’encodage de toutes les requêtes :

import java.io.IOException;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 public class EncodingFilter implements javax.servlet.Filter {
 	private String encoding;
 	public void init(FilterConfig filterConfig) throws ServletException {
 		this.encoding = filterConfig.getInitParameter("encoding");
 	}
 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
 		request.setCharacterEncoding(encoding);
 		filterChain.doFilter(request, response);
 	}
 	public void destroy() {
 	}
 }

Ensuite, il faut déclarer le filtre dans le fichier /WEB-INF/web.xml ainsi :

<filter>
 	<filter-name>Encoding Filter</filter-name>
 	<filter-class>EncodingFilter</filter-class>
 	<init-param>
 		<param-name>encoding</param-name>
 		<param-value>UTF-8</param-value>
 	</init-param>
 </filter>
 <filter-mapping>
 	<filter-name>Encoding Filter</filter-name>
 	<url-pattern>/*</url-pattern>
 </filter-mapping>

Maintenant toutes les requêtes sont correctements lues avec l’encodage UTF-8.

Conclusion

La seconde solution est non-intrusive et plus sûre. De plus, elle n’est pas spécifique à Struts et peut être utilisée pour n’importe quel type d’application web J2EE.

Il ne reste plus qu’à traduire vos applications en chinois. :-D

 

Notes

[1] Comme les caractères accentués tels que é, è, à, ô, …

Email 2 icon 1.3.0

30 août 2006

Le projet déménage et en profite pour proposer de nouvelles fonctionnalités ! La nouvelle version est accessible à l’adresse http://email2icon.lecacheur.com.

Maintenant, l’outil est disponible en anglais et en français, le tout en UTF-8. Les mails sont également envoyés en anglais ou en français. Les icônes générées sont accessibles via une URL permanente. Email 2 icon propose même un bout de code HTML à intégrer dans votre site pour afficher votre adresse email.