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 :

Conversion chaine iso -> UTF


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 24
    Points
    24
    Par défaut Conversion chaine iso -> UTF
    Bonjour a tous,

    J'essaye de lire depuis une URL un fichier xml donc j'ai un "encoding" comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="iso-8859-1"?>
    Et ensuite je l'écrit dans un fichier, le probleme c'est que certain caractère sont mal réecrit dans le fichier ... j'ai donc essayer de convertir la chaine avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	    String ligne;
    	    while ((ligne = br.readLine()) != null) {
    		String conv = new String (ligne.getBytes(), "UTF8");
    		fw.write(conv);
    	    }
    Mais toujours pareil, je dois mal m'y prendre ou j'utilise pas les bons formats, Need help

    Merci beaucoup.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Lors de la lecture tu peus indiquer l'encodage du flux que tu lit,
    et lors de l'écriture tu peus indiquer l'encodage dans lequel tu souhaite que ton flux soit écrit.
    Donc dans ton code tu doit spécifier iso-8859-1 puisque tu lit un flux codé en iso-8859-1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String conv = new String (ligne.getBytes(), "iso-8859-1");

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Ok, j'ai essayer vos proposition... en mettant ca:

    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
     
                URL addr = new URL("http://medias.krinein.com/programmes.rss");
     
    	    BufferedReader br = null;
    	    FileWriter fw = new FileWriter("flux.xml");
    	    br = new BufferedReader(new InputStreamReader(addr.openStream()));
     
    	    String ligne;
    	    while ((ligne = br.readLine()) != null) {
    		System.out.println(ligne);
    		String conv = new String (ligne.getBytes("ISO-8859-1"));
    		fw.write(conv+"\n");
    	    }
     
    	    fw.close();
    C'est un peu mieux, maintenant à la place des accents et des caractères "bizards" j'ai des "?" alors qu'avant j'avais des hyérogliphe (désolé pour les egyptiens je sais pas écrire).

    Je dois pas être tres loin .

    Merci pour vos réponse .

  4. #4
    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 ne dois pas utiliser le charset sur getBytes() mais bien sur ton InputStreamReader. Les Reader 'encode' correctement les caractères selon le charset que tu précises (ou en utilisant Charset.defaultCharset() si tu n'en précises aucun). Ensuite getBytes() sur la String obtenu permet d'effectuer des conversions.

    • Donc tu lis le fichier avec le charset par défaut du système (ce qui est faut puisque tu devrais utiliser ISO-8859-1).
    • Tu convertis la chaine obtenu du charset par défaut vers l'ISO-8859-1. Ce qui ne te donneras pas un bon résultat puisque les caractères ont déjà été "encodé" avec un mauvais charset : donc la conversion se base sur une "erreur"...


    Il faut donc que tu spécifies l'encodage dans ton objet InputStreamReader...

    Enfin une remarque : tu devrais utiliser des bloc try/finally pour libérer proprement les ressources.

    Cela pourrait donner :
    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
            URL addr = new URL("http://medias.krinein.com/programmes.rss");
     
            BufferedReader br = new BufferedReader(new InputStreamReader(addr.openStream(), "ISO-8859-1"));
            try {
                FileWriter fw = new FileWriter("flux.xml");
                try {
                    String ligne;
                    while ((ligne = br.readLine()) != null) {
                        fw.write(ligne + "\n");
                    }
                } finally {
                    fw.close();
                }
            } finally {
                br.close();
            }
    Mais puisqu'il semble que tu te contentes de sauvegarder le fichier depuis une URL, tu peux carrément te passer d'encodage et d'utiliser une écriture/lecture par octet :
    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
            URL addr = new URL("http://medias.krinein.com/programmes.rss");
     
            InputStream in = addr.openStream();
            try {
                OutputStream out = new FileOutputStream("flux.xml");
                try {
                    byte[] buf = new byte[2048];
                    int r = 0;
                    while ( (r=in.read(buf)) > 0 ) {
                        out.write(buf, 0, r);
                    }
                } finally {
                    out.close();
                }
            } finally {
                in.close();
            }
    a++

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    En fait le plus simple c'est de directement spécifié le charset au constructeur de l'InputStreamReader. Tu peus aussi utiliser un PrintWriter pour l'écriture (comme ça tu peus aussi spécifier l'encodage au constructeur). Et n'oublie pas de fermer les flux :
    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
    URL addr = new URL("http://medias.krinein.com/programmes.rss");
    PrintWriter pw = new PrintWriter("flux.xml");
    // ou pour écrire en UTF-8 : PrintWriter pw = new PrintWriter("flux.xml", "UTF-8");
     
    BufferedReader br = new BufferedReader(new InputStreamReader(addr.openStream(), 
                                           "ISO-8859-1"));
    try {
        String ligne;
        while ((ligne = br.readLine()) != null) {
            System.out.println(ligne);
            pw.println(ligne);
            pw.flush();
        }
    } finally {
        try {
            pw.close();
        } finally {
            br.close();
        }
    }
    [edit] grilled

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par TronsoT
    Je dois pas être tres loin .
    ouais pas loin ... hiéroglyphe

  7. #7
    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
    Citation Envoyé par le y@m's
    Tu peus aussi utiliser un PrintWriter pour l'écriture (comme ça tu peus aussi spécifier l'encodage au constructeur).
    Oups j'avais complétement zappé le coté ISO-UTF8... donc oui le mieux est de passer par un Reader/Writer...

    a++

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Oki, merci beaucoup à tous.

    Les solutions marchent nikel pour ceux à qui ca arriverait ^^

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

Discussions similaires

  1. [PHP 5.3] Cherche fonction conversion interclassement (ISO-8859-1 -> UTF-8)
    Par clement106 dans le forum Langage
    Réponses: 2
    Dernier message: 10/09/2011, 22h54
  2. [MySQL] Conversion de iso-8859-2 à UTF-8
    Par phoque.r dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/08/2007, 10h41
  3. Conversion chaine en decimal
    Par siddh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/02/2006, 17h50
  4. conversion chaineISO8859-1,... en UTF-8
    Par ep31 dans le forum MFC
    Réponses: 21
    Dernier message: 09/12/2005, 12h24
  5. [POO] conversion chaine de caractere en objet
    Par seb_fou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/02/2005, 09h41

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