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

Langage Java Discussion :

Caractères accentués mal encodés à la sortie d'une servlet


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut Caractères accentués mal encodés à la sortie d'une servlet
    Bonjour,

    Voici mon problème.

    Tous mes fichiers (Java, JSP, logs) sont encodés en UTF-8. Avec des classes Java, je trace des logs dans un fichier. Ce fichier s'affiche parfaitement sur une console en UTF-8.
    Après lecture de ce fichier via des classes Java, et un affichage sur un navigateur via une page JSP, les caractères accentués ne s'affichent pas correctement.

    En récupérant les données dans des String sans manipulation particulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ligne = fic.readLine();
    Précontrôle des droits OK
    Récupération de rep.config dans le contexte
    Contrôle des droits OK
    En indiquant l'encodage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ligne = new String(fic.readLine().getBytes(), "UTF-8");
    Précontr�?le des droits OK
    Récupération de rep.config dans le contexte
    Contrôle des droits OK
    Etrange... Avez-vous une idée ? Merci.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu dois préciser l'encodage lorsque tu ouvres le fichier et non pas tenter de le transformer lorsque tu as une String si cette dernière est mal encodé tu ne pourras pas revenir en arrière...

    a++

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut
    Ca fonctionne, merci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fichier), "UTF-8"));
    Mais j'ai un autre problème du même genre...

    Une servlet retourne un document Xml généré à l'aide du parser Dom. Les données étant hétérogènes, la chaine est convertie.
    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
    protected void service(HttpServletRequest req, HttpServletResponse resp) {
     
       PrintWriter out = resp.getWriter();
       resp.setCharacterEncoding("utf-8");
       resp.setContentType("application/xml");
     
       Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
       doc.setXmlVersion("1.0");
       doc.setXmlStandalone(true);
       (...)
     
       out.print(new String(documentToString(doc).getBytes(), "UTF-8"));
    }
     
    private String documentToString(Document document) {
     
       StringWriter sw = new StringWriter();
       final Transformer trans = TransformerFactory.newInstance().newTransformer();
       trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
       trans.setOutputProperty(OutputKeys.INDENT, "yes");
       trans.transform(new DOMSource(document), new StreamResult(sw));
       return sw.toString();
    }
    Une fois ce fichier XML récupéré, sa validation pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void valider(final File xml, final String xsd) {
     
       SchemaFactory usine = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
       Schema schema =
                    usine.newSchema(new StreamSource(ContexteDAO.get().retrieve(Constantes.REP_CONFIG, Boolean.TRUE)
                        + xsd));
       Validator validator = schema.newValidator();
       validator.validate(new StreamSource(xml));
    }
    Une exception est en effet générée :
    (Invalid byte 2 of 3-byte UTF-8 sequence.) com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:674)
    com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:398)
    com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
    com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(XMLEntityScanner.java:1416)
    com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2777)
    com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:645)
    com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508)
    com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:144)
    com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:107)
    javax.xml.validation.Validator.validate(Validator.java:127)
    Dans les logs, voici la ligne qui doit poser problème...
    <trace>Rechargement termin�(e)</trace>
    Comment améliorer cet échange de données pour qu'il soit parfaitement compatible UTF-8 ? Merci.

Discussions similaires

  1. [Dev-Pascal] Afficher les caractères accentués dans la console et dans une MessageBox
    Par escargot72 dans le forum Free Pascal
    Réponses: 12
    Dernier message: 28/12/2014, 15h19
  2. [XWiki] Caractères accentués mal décodés
    Par AurelienDev dans le forum Autres
    Réponses: 0
    Dernier message: 07/07/2009, 11h32
  3. Réponses: 1
    Dernier message: 29/03/2009, 17h45
  4. [SQL] Les caractère accentués s'affichent mal après une requête SQL
    Par sayerh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/03/2008, 11h56
  5. Utilité de bufferiser la sortie d'une servlet ?
    Par dedz dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/03/2007, 16h56

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