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

Java Discussion :

Java & Encodage


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut Java & Encodage
    Bonjour,

    J'ai une question concernant les encodages de caractères en Java.

    Dans un webservice, je reçois un flux xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
    Si je parse ce flux (en utilisant l'API JDOM), puis je assumer que Java saura que les caractères sont encodés en ISO-8859-1 ?


    Deuxième question,
    Si je créer un fichier de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintWriter fileWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),"Cp850")));
    Java va t'il automatiquement m'encoder les string récupérées dans le flux précédent, que j'écris dans ce fichier via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileWriter.write(String a)
    ?

    Merci pour vos réponses

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Mister_Kp Voir le message

    Si je parse ce flux (en utilisant l'API JDOM), puis je assumer que Java saura que les caractères sont encodés en ISO-8859-1 ?
    Non, c'est un des paradoxe du format xml. Pour savoir lire le header précisant l'encodage il faut déjà avoir décodé les donnés. donc il faut quand même connaître cette information à l'avance....


    Java va t'il automatiquement m'encoder les string récupérées dans le flux précédent, que j'écris dans ce fichier via
    C'est le but de l'utilisation d'un writer, encoder les caractères

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut
    Merci pour ta réponse.... qui ne m'arrange pas

    Non, c'est un des paradoxe du format xml. Pour savoir lire le header précisant l'encodage il faut déjà avoir décodé les donnés. donc il faut quand même connaître cette information à l'avance....
    En fait, je reçois cette réponse suite à une requete Http (via l'API HttpClient):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HttpGet httpGet = new HttpGet(this.urlService+params);
    		ResponseHandler<String> responseHandler = new BasicResponseHandler();
    		message = this.httpClient.execute(httpGet,responseHandler);
    Du coup, saurais tu comment faire pour indiquer à Java quel encodage employer ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    http client, c'est quoi, il viens d'ou? Si il te retourne un String, c'est lui qui est responsable du décodage dans ce cas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut
    Pardon, manque de précision:

    HttpClient, c'est l'API d'Apache pour creer et recevoir des requêtes HTTP.
    Dans mon cas: this.httpClient fais référence à: DefaultHttpClient de l'API.

    Dans ce cas là, effectivement je recupère une string, mais il y a plusieurs moyen de traiter la réponse du serveur.
    En fait il faudrait que je saches si ce BasicReponseHandler tient compte du "Charset" de l'entête Http pour déterminer l'encodage ou pas.

    Je vais peut-être allé poser ma question dans le sous forum approprié.

    Merci quand même

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Non, c'est un des paradoxe du format xml. Pour savoir lire le header précisant l'encodage il faut déjà avoir décodé les donnés. donc il faut quand même connaître cette information à l'avance....
    Euh, non, le paradoxe en question a été largement résolu.
    Les parseurs XML, y compris JDOM donc, se débrouillent très bien pour lire un flux d'octets représentant du XML, et repérer la déclaration d'encodage au début de ce flux.

    Essayez c'est gagné.

    Dans le cas où le charset n'est pas déclaré avec une déclaration de ce type et qu'il n'est pas en UTF-8, alors il devient nécessaire de préciser au parseur quel encodage utiliser (ou de lui passer un Reader au lieu d'un InputStream, le Reader se chargeant d'appliquer le charset.)
    Dans ce cas-là, seulement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le paradoxe n'est que partiellement résolu. Seul certains encodages sont utilisables. Pour les autres encodages, il faut passer le charset au builder. Par exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(new File("/tmp/test.xml"));
    se cassera les dents sur un fichier en UTF-7:
    org.jdom.input.JDOMParseException: Error on line 1 of document file:/tmp/test.xml: Invalid encoding name "UTF-7".
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:530)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:905)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:884)
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(new InputStreamReader(new FileInputStream("/tmp/test.xml"),"UTF-7"));
    le lira sans aucun soucis.

    (dans les deux cas, la jvm connais l'UTF-7)

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hmm... Ma foi oui, pour quelque chose comme l'utf-7 ou d'autres charsets non explicitement gérés par l'autodétection XML et non rétrocompatibles ASCII.

    Quoiqu'il en soit, ISO-8859-whatever est rétrocompatible ASCII, et ISO-8859-1 est explicitement listé comme devant être géré. Du moment que la déclaration XML est correcte, les parseurs se débrouillent tous seuls avec ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hmm... Ma foi oui, pour quelque chose comme l'utf-7 ou d'autres charsets non explicitement gérés par l'autodétection XML et non rétrocompatibles ASCII.
    bah seulon les specs xml, utf-7 c'est autorisé , comme tout encodage référencé par l'IANA

    Mais il est vrai qu'on reste limité a des codage particulier. La série des ISO, UTF 8/16/32, les charset coréen japonais, cyrilliques etc sont supporté (j'aurais appris un truc aujourd'hui, quand j'avais commencé les api xml il y a longtemps, c'était pas cas )

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bah, tout ce qui existe et a la capacité intrinsèque de représenter les caractères indispensables à XML, est autorisé, puisque sinon ce serait interdit -_-°. Mais c'est un cas à part reconnu dans l'écosystème XML : pas géré par l'autodétection => obligation d'aider le parseur à l'aide d'autres sources.

    Ceci étant, je n'avais même pas pensé à ces cas-là dans ma formulation, donc en effet elle marche pas. Ajouter Du moment que l'encodage n'est pas trop hétéroclite, au début .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut
    Merci pour toute ces précisions.

    Du coup, je me retrouve avec un autre problème:

    Je cree un FileWriter de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintWriter fileWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),"Cp850")));
    Et j'ai un String contenant une chaine de caractère lu en ISO-8859-1.
    Si j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileWriter.write(maStringEnIso)
    Cela ne me convertit pas la String en IBM850 (Cp850).
    Quand j'affiche le fichier (avec Gedit), les caractère ne sont pas correctement encodé. De même si je met UTF-8. par contre, je met ISO-8859-1, ils apparaissent correctement.

    Maintenant, si je veux changer d'encodage, comment dois-je faire ?

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Mister_Kp Voir le message
    Et j'ai un String contenant une chaine de caractère lu en ISO-8859-1.
    Que la chaîne soit lue en ISO-8859-1 n'a aucune importance. Quand on a un String, il n'y a plus de question d'encodage. Un String est un String, les octets d'où il vient, c'est du passé.

    Peut-on voir le code qui lit ce String ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut
    Oui effectivement, je me suis planté, tout marche bien maitenant.
    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Java EE, Encodage des caractères dans un formulaire
    Par sanzo1988 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/06/2012, 12h21
  2. Java byte encodage
    Par drKzs dans le forum Général Java
    Réponses: 31
    Dernier message: 10/06/2011, 19h30
  3. problème java-mysql encodage des caracteres
    Par mrdindo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 14/06/2008, 14h13

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