Forum Programmation.java Serveur Tomcat : problème d'accents

Posté par  .
Étiquettes : aucune
0
8
avr.
2005
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  . Évalué à 1.

    Est-ce que cela ne viendrait pas de la configuration de ton navigateur?
    Enfin comme toujours: moi je dis ça mais je dis rien....:-)
  • # meuh

    Posté par  (site web personnel) . Évalué à 6.

    Le tag HTML dont tu parles passes au second plan par rapport à l'entête HTTP Content-Type, lorsque le browser reçoit la réponse. Si une telle entête est présente (et à ma connaissance tomcat la place) alors ton tag HTML sera ignoré.

    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  . Évalué à 1.

      Merci beaucoup! ton "exposé" sur le codage des carctères est très instructifs.

      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  . Évalué à 3.

    vérifie qu'au démarrage de tomcat la variable LANG soit bien positionnée sur fr_FR et non C
    • [^] # Re: problème identique

      Posté par  . Évalué à 1.

      avant de lancer tomcat je vérifie comme tu l'indiques la variable LANG :

      # 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  (site web personnel) . Évalué à 2.

        Ce n'est pas LANG.

        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  (site web personnel) . Évalué à 3.

      D'une part ce n'est pas LANG comme je le dis plus loin, d'autre part ce n'est pas du tout conseillé de se fier à l'encoding par défaut du système, parce que si celui-ci change tous tes services vont foirer. Utiliser plutôt la méthode que je décris plus haut, qui configure précisément ce que l'on veut.
      • [^] # Re: problème identique

        Posté par  . Évalué à 3.

        c'est la seule solution que j'ai trouvé pour forcer une appli à afficher correctement les accents :-(
        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 ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.