IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

problème d'encodage utf-8


Sujet :

Développement Web en Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut problème d'encodage utf-8
    Bonjour,

    Mes page jsp s'affichent en ISO-8859-1.
    J'ai besoin que l'une d'entre elle s'affiche en UTF-8

    Comme indiqué ici :
    http://www.developpez.net/forums/d52...dencodage-jsp/

    J'ai ajouté cette ligne au début de ma page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ page contentType="text/html;charset=ISO-UTF-8" language="java" %>
    Mais la page plante

    Alors qu'elle ne plante pas en ajoutant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ page contentType="text/html;charset=ISO-8859-1" language="java" %>

    Alors que faire ?
    Vous avez une idée ?

  2. #2
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 50
    Points : 58
    Points
    58
    Par défaut
    Poste donc l'erreur dont tu parles.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'est UTF-8, pas ISO-UTF-8

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    @voleurdecarottes

    Il n'y a pas d'erreur sur mon site. L'affichage se fait correctement.
    Le problème, c'est que je veux récupérer cette page sur un autre site (comme une sorte de flux)
    Ce site attend de l'UTF-8.
    Et donc il génère des erreurs pour certains champs avec accents.


    @tchize_

    Oui c'est UTF-8. J'ai fait une faute en postant.
    Le soucis ne vient donc pas de là.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux poster un exemple de fichier qui sort de ton serveur, qu'on regarde ce qu'il a dans les tripe, ainsi que le jsp en un peu plus large

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    OK, je vais tenter d'expliquer le truc.
    C'est une histoire d'encodage de paramètre.

    La page en question s'appelle catalogue.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <%@ page contentType="text/html;charset=ISO-8859-1" language="java" %>
    <%@ page import="java.util.*" errorPage="error.jsp" %>
    <% response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    %>
    <jsp:useBean id="sqlManager" class="iDealWine.SqlJSPBean" scope="page" />
     
    <% String appellation = request.getParameter("pays");
     
    String statement = "select lot.gpiliblibre||';'||REPLACE(REPLACE(lot.libelle_100_5,Chr(10),' '),Chr(13),' ')||' '||lot.GPICPTRIB||';'||lot.FG11||';'||lot.MT05||';'||lot.MT04||';'||lot.MT01 ,"+ 
     
    " 'http://www.lkjhlkjh.com/fr/llkjhlkh.jsp?vente='||lot.GPIROLE||'&'||'numLot='||lot.nb01, "+ 
     
    " TO_CHAR(vente.DATE2_DT,'YYYY-MM-DD hh24:mi:ss')"+ 
     
    " from g_piece lot,g_information vente,type_vin vin "+ 
     
    " where vente.refinfo=lot.gpirole   "+
    " and  vin.pays='"+ pays +"' "+ 
    " and   vin.id_tvin=lot.gpiliblibre "+ 
     
    " and   nvl(vente.encodeur,'0')='1' "+
     
    " order by vente.refinfo,lot.nb01";
     
    String separator = ";";
     
    String eol="<br>";
     
    int cols=3;
     
    		if ( request.getParameter("requete")!=null) statement=request.getParameter("requete");
     
    	if ( request.getParameter("sep")!=null) separator=request.getParameter("sep");
     
    	if ( request.getParameter("fin")!=null) eol=request.getParameter("fin");
     
    	if ( request.getParameter("cnt")!=null) cols=new Integer(request.getParameter("cnt")).intValue();
     
    		Vector rs = sqlManager.ExecuteEx(statement, separator, eol, cols);
     
    %><%
     
    if ( !sqlManager.sqlerror ) {
     
    	if (rs != null && rs.size() > 0) {          
     
                for (int i=0; i<rs.size(); i++) {            
     
                  String[] data = (String[])rs.elementAt(i);
     
                  out.println(data[0]);
     
                }
     
            }
     
    }%>
    Comme on peut le voir dans le code, cette page catalogue.jsp attend une variable "pays"

    Donc on ouvre cette page comme cela :
    http://www.blabla.com/catalogue.jsp?pays=France
    ou
    http://www.blabla.com/catalogue.jsp?pays=Congo

    Cette page fonctionne correctement tant qu'il n'y a pas de caractères spéciaux, mais si par exemple en variable nous mettons un accent, ça ne marche plus:

    par exemple si on appelle la page http://www.blabla.com/catalogue.jsp?pays=Égypte

    Les navigateurs (en tout cas Mozilla et IE) transforme cette URL en
    http://www.blabla.com/catalogue.jsp?pays=%C9gypte

    ce qui donne un faux résultat.

    Dans cette exemple, le bon résultat serait celui-ci :
    http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte

    Il faudrait trouver un moyen de transformer Égypte en %C3%89gypte dans la page catalogue.jsp

    Voilà, j'espère que c'est plus clair

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    Une précision:

    Sur mon site, j'ai un petit outil qui permet de faire cet encodage pour une variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <%@ page import="java.net.*" errorPage="error.jsp"%>
    <%response.setContentType("text/html;charset=iso-8859-1");%>
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <%=(request.getParameter("urlx")!=null?request.getParameter("urlx"):"")%>
    <form method="POST">
    <input type="text" value="<%=(request.getParameter("urlx")!=null?request.getParameter("urlx"):"")%>" name="urlx" size=65><br>
    <input type="text" value="<%=(request.getParameter("urlx")!=null?URLEncoder.encode(request.getParameter("urlx"),"UTF-8"):"")%>" size=65><br>
    <input type="submit" name="encode" value="encode">
    </form>
    </body>
    </html>


    J'ai donc tenté de remplacer dans catalogue.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <% String appellation = request.getParameter("pays");
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <% String appellation = URLEncoder.encode(request.getParameter("appellation"),"UTF-8");
    Mais ça marche pas. Si je fais ça même en appelant http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte, ça ne marche plus

    Alors que faire ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Alors d'abord mettre directement le pays dans la request sql sans vérification, c'est suicidaire du point de vue de l'SQL injection. Donc je te conseille de corriger ça au plus vite.

    Ensuite, l'encodage des paramètres passés en argument est quelque chose d'assez problématique d'une manière générale, le navigateur va utiliser l'encodage en cours sur la page à se trouve le lien. Si c'est un formulaire, il utilisera, si disponible, le champ accept-charset de celui-ci.

    Ensuite, viens la partie désagréable. Rien dans les spécification http ne permet au serveur de connaitre l'encodage de l'url utilisé par le client. Dans ce cas, avant de lire l'url (ou tout du moins ses paramètres), il convient de définir l'encodage de ceux-ci. Hors une jsp lit les parametres avant d'appeler ton code jsp -> trop tard pour définir l'encoding. Il te reste alors deux possibilité

    Soit définir globalement pour ton conteneur webapp l'encodage par défaut des requetes. La config dépend du conteneur (elle se fait dans le server.xml sous tocmat si ma mémoire est bonne)

    Soit tenter une conversion inverse pour corriger le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String value = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
    Mais c'est possible uniquement pour un parametre décodé par erreur comme étant iso au lieu d'autre chose. En iso-8859-1, on utilise tous les entiers de 0 à 255 sans restriction, donc il est toujours possible d'inverser la conversion pour revenir aux bytes d'origine. Alors qu'en UTF-8 ou d'autres format, cette inversion n'est plus possible

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup Tchize pour ton aide

    Je viens d'essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <% String appellation =  new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
    mais ça ne fonctionne pas, ça fait la même chose que pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <% String appellation = URLEncoder.encode(request.getParameter("appellation"),"UTF-8");
    ça ne donne aucun résultat, même si je tape l'URL http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte, qui devrait donner un bon résultat.


    Si je pouvais trouver une solution qui m'évite de toucher à d'autre fichiers, ça m'arrangerait car je connais pas du tout ce qu'est le webapp conteneur, et puis je crois que j'ai pas trop les droits d'y toucher....

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la première chose à faire serait d'afficher la valeur de request.getCharacterEncoding. A partir de là, tu construis tes url <a href="..."> en utilisant le bon encoding. Et tu utilise ce meme encoding comme pageEncoding pour éviter d'amener le navigateur à confondre.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    Désolé, mais j'y connais pas énormément. Je ne comprend pas ce que tu proposes.

    L'idée c'est qu'on tape l'url http://www.blabla.com/catalogue.jsp?pays=Égypte

    et que cela donne le même résultat que http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte

    ou bien http://www.blabla.com/catalogue.jsp?pays=Grèce donne
    http://www.blabla.com/catalogue.jsp?pays=Gr%C3%A8ce

    Ce problème n'existe que sur 3 ou 4 caractères.
    Peut être que cette conversion peut se faire manuellement...

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non, l'idée c'est pas que l'on "tappe" l'url mais qu'elle soit sous forme de lien avec les % qui correspondent à la maniere dont ton serveur décode les url. Et pour ca il faut qu'il y aie cohérence entre les élément suivant

    l'encodage de la page en cours
    l'encodage utilisé pour les %
    l'encodage par défaut utilisé par ton conteneur pour décoder les urls

    Si ces trois n'utilisent pas strictement le meme encodage, tu risque d'avoir des problèmes

    Et quand on tappe à la main l'url dans le browser, on est coincé, le serveur va prendre son encodage par défaut, mais rien n'indique que le navigateur va utiliser le même.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    Désolé Tchize, je ne comprend pas

    Est-ce que la seule solution, c'est d'appeler directement ce type d'URL ?
    http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ajor Voir le message
    Désolé Tchize, je ne comprend pas

    Est-ce que la seule solution, c'est d'appeler directement ce type d'URL ?
    http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte
    uniquement si ton serveur fait du décodage en utf-8.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    Je formule autrement ma question

    Cette url fonctionne bien:
    http://www.blabla.com/catalogue.jsp?pays=%C3%89gypte


    Mais existe-t-il une autre solution qui ferait en sorte que cette url fonctionne http://www.blabla.com/catalogue.jsp?pays=Égypte ?

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je vais tenter d'expliquer:

    L'url que tu mentionne n'est simplement pas autorisée dans les header http telle quelle (uniquement le ansi 7bits est autorisé). Pour être compatible ton browser va transformer ton È en une séquence de %xx. La ou ça coince, c'est que les spécification http, bien qu'ayant précisé comment on transforme en %xx, se basent sur le codage de caractère choisi. Mais elle ne précise pas comment le serveur peut connaître le codage utilisé par le client. De même le browser est un peu dans le flou pour savoir lequel choisir. En pratique, le browser va essayer d'utiliser dans ce cas l'encodage de la page courante où se trouve le lien avec un È (On recommande de mettre directement les % dans les liens, ca lève l'ambiguité à tous les coups). Mais si il n'y a pas de page courante (example url copié collée depuis une email, tappée à la mains ou éventuellement bookmarkée) c'est l'impro totale coté browser. Un browser va te l'encoder avec %C3%89gypte (utf-8) mais un autre pourrais te l'encoder avec %C8gypte (iso-8859-1). Et c'est ton conteneur webapp qui va faire ce décodage, t'aura donc aucun controle dessus. D'après ta description, ton conteneur va utilsier l'utf-8. Donc tu va d'office perdre les lcient iso-8859-1 (et vice versa si tu fesait de l'iso-8859-1 par défaut)

    De mémoire, il existe une option de config dans firefox pour lui dire d'utiliser utf-8 par défaut, je crois que c'est "network.standard-url.encode-query-utf8" à mettre à true, mais j'en suis pas certain à 100%

Discussions similaires

  1. [FPDF] Encodage UTF-8
    Par navis84 dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 08/09/2018, 12h43
  2. problème d' encodage utf-8 (je pense en tout cas)
    Par reventlov dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 29/05/2008, 19h47
  3. [DOM] Problème d'encodage UTF-8
    Par Valter dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/05/2008, 15h32
  4. Problème d'encodage UTF-8
    Par Shugo78 dans le forum Ubuntu
    Réponses: 0
    Dernier message: 23/11/2007, 19h40
  5. [MySQL] Problème d'encodage UTF-8
    Par cloridriks dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/10/2007, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo