bonjour,
J'utilise tomcat 5.5.7 comme serveur web, et lorsque je consulte les pages web du serveur dans un navigateur web(un client) les lettres avec accents(genre à,é,è...) sont remplacées par des caractères bizar...
pourtant dans mes pages web je met bien :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
d'ailleurs j'ai tout essayé à ce niveau là : utf-8,iso-8859-15,... ca ne change rien!
y aurait-il une manip à faire dans le fichiers de config de tomcat ( comme par exemple server.xml) ?
Merci.
# Navigateur...
Posté par Potato . Évalué à 1.
Enfin comme toujours: moi je dis ça mais je dis rien....:-)
# meuh
Posté par gc (site web personnel) . Évalué à 6.
En théorie, tu utilises Tomcat pour servir une servlet pure, ou du JSP. Le mieux est de servir ton contenu textuel en provenance de fichiers properties ou d'une base de données, pour pouvoir avoir des sources et JSP moins crades et plus maintenables, et la localisation des messages. Dans ce cas-là, ton contenu sort d'une String java, et la question est de permettre à tomcat de savoir quel codage utiliser pour les afficher. Tomcat se servira du ContentType associé à l'objet HttpServletResponse. Plusieurs solutions :
- tu fais une servlet java pure (pas de JSP et pas d'HTML) dans ce cas-là utiliser response.setContentType( "text/html; charset=UTF-8" ); pour forcer le type (il est même possible que ce ne soit pas nécessaire dans ce cas-là - mais en général c'est utile, on verra plus loin pourquoi)
- tu fais du JSP ; dans ce cas-là utiliser <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- tu mets du texte en dur dans du JSP ou de l'HTML ; dans le premier cas utilise la directive page de la ligne précédente pour préciser le charset dans lequel est encodé ton texte ; dans le deuxième cas, aucune idée :) mais tu peux très bien utiliser un JSP avec seulement cette directive et tout le reste en HTML pur
La problématique principale pour l'internationalisation avec tomcat est la façon dont tu vas recevoir les données entrées par les utilisateurs. Il s'agit des données passées par HTTP GET (URL avec paramètres derrière) ou HTTP POST (formulaire). Le problème est dans le premier cas qu'il n'existe pas de standard pour indiquer le codage des caractères (qui sont eux-même URL-encodés bien sûr), dans le second cas que les navigateurs n'envoient pas dans l'entête Content-Type le codage utilisé. D'après ce que j'avais vu dans le bugzilla de Mozilla (mais je ne retrouve plus la référence), ils avaient corrigé ce "problème" mais ça en créait trop de nouveaux dans les serveurs web existants.
La meilleure solution consiste donc à faire en sorte d'être raisonnablement sûr que le navigateur enverra les informations dans un codage déterminé.
La solution la plus simple à mettre en oeuvre et de tout faire en UTF-8. Ça permet une internationalisation sans soucis et c'est bien supporté par les navigateurs (même la passoire bien connue qui sert de navigateur dominant actuellement).
Dans le cas des informations reçues par HTTP GET, en général il s'agit d'un lien que tu auras créé dynamiquement dans ta servlet ou ton JSP. Assure-toi de le créer en UTF-8, et ajoute useBodyEncodingForURI="true" dans les attributs du Connector de ton server.xml (à partir de tomcat 5).
Dans le cas des informations reçues par HTTP POST, il s'agit de ce que l'utilisateur aura entré dans son navigateur. Comme je le disais plus haut, les navigateurs n'envoient pas le codage utilisé, donc lorsque tomcat va recevoir ces informations, il ne pourra pas savoir comment décoder les caractères - et par défaut il utilise ISO-8859-1 (c'est dans la norme des servlets).
Envoi (point de vue du navigateur)
Pour être sûr que le navigateur enverra les informations en UTF-8, en théorie c'est vers l'attribut accept-charset="UTF-8" de l'élément form qu'il faudrait se tourner, mais l'implémentation actuelle des navigateurs pousse à une autre solution : faire en sorte que la page qui contenait le formulaire soit elle-même codée en UTF-8. Pour ce faire, voir plus haut - response.setContentType( "text/html; charset=UTF-8" ); et <%@ page contentType="text/html;charset=UTF-8" language="java" %> sont la meilleure solution.
Réception (point de vue de ta servlet)
Ensuite, comme je le disais plus haut, il faut s'assurer que tomcat décodera les informations reçues avec le codage UTF-8. Le plus simple est de forcer le codage de HttpServletRequest : request.setCharacterEncoding( "UTF-8" );. Pour ne pas dupliquer cela dans tous les JSP et servlets, le mieux est d'utiliser un Filter, par exemple SetCharacterEncodingFilter.java qui est disponible en standard avec tomcat.
En espérant t'avoir été agréable.
[^] # Re: meuh
Posté par arn100 . Évalué à 1.
Maitenant je met cette ligne dans mes pages html et jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
et ca marche, plus de problème de codage de caractère tout bizar !
ce qui est étrange c'est que je dois également la mettre dans les pages "html" et donc la ligne <meta http-equiv="Content-Type" content="text/html; charset='ce qu'on veut'"> est inutile... enfin bon..., sa marche comme ça et pas le temps de comprendre exactement pourquoi alors tant pis.
encore merci
# problème identique
Posté par moudj . Évalué à 3.
[^] # Re: problème identique
Posté par arn100 . Évalué à 1.
# echo $LANG
fr_FR.UTF-8
du coup (pour enlever UTF-8), je fais :
# export LANG=fr_FR
# echo $LANG
fr_FR
je relance Tomcat... mais ca ne change rien.....
mais comme je l'indique plus haut :
<%@page ..charset=UTF-8" ....%> ca marche bien maintenant
merci tout de même.
[^] # Re: problème identique
Posté par gc (site web personnel) . Évalué à 2.
import java.io.InputStreamReader;
import java.io.ByteArrayInputStream;
public class T {
public static void main( String args[] ) {
byte b[] = {};
InputStreamReader isr
= new InputStreamReader( new ByteArrayInputStream( b ) );
System.out.println( "JVM's default encoding: " + isr.getEncoding() );
}
}
Mon système est en en_US/UTF-8 :
[gc@meuh /tmp] java T
JVM's default encoding: UTF8
[gc@meuh /tmp] LANG=fr_FR java T
JVM's default encoding: UTF8
[gc@meuh /tmp] LC_CTYPE=fr_FR java T
JVM's default encoding: ISO8859_1
[gc@meuh /tmp] LC_ALL=fr_FR java T
JVM's default encoding: ISO8859_1
Regarde tes variables avec "locale". Change la locale du système avec l'outil dispo avec ton système si tu en as un (localedrake chez mandrak^Hiva), sinon cherche des docs là-dessus. Mais en général LC_ALL suffit pour passer devant toutes les autres (sauf LANGUAGE).
[^] # Re: problème identique
Posté par gc (site web personnel) . Évalué à 3.
[^] # Re: problème identique
Posté par moudj . Évalué à 3.
C'est une appli d'un prestataire sur laquelle je n'ai pas la main[1]...
[1] je n'ai pas la main sur l'appli... sur la prestataire non plus cela dit ;-)
[^] # Re: problème identique
Posté par gc (site web personnel) . Évalué à 3.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.