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 :

Encodage sous windows


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut Encodage sous windows
    Bonjour,

    Actuellement en train de développer une appli java avec Swing, je rencontre un problème d'encodage sous windows (pourquoi faut il encore développer pour windows ? :/) et ceci à 2 moments.

    Tout d'abord je saisis mes données via un formulaire et les enregistre dans des objets, à tout moment, quand je souhaite en faire l'affichage, les données enregistrées apparaissent correctement, mais ça se complique lorsque je veux les envoyer en xml, et enregistrer mon ensemble d'objets. Windows n'apprécie pas les caractères spéciaux.

    Pour l'instant je n'ai travaillé qu'à débugguer l'export xml en créant une String sensée être formattée en UTF-8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     String xml = new String(xmlWithSpecialChars.getBytes(), "UTF-8");
    Quand à la partie "enregistrement" de mes objets je le fais de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try{
    File f= new File(...);
    fos = new FileOutputSteam(f);
    oos = new ObjectOutputStream(fos);
    oss.writeObject(monObjet);
    } catch(IOException ex){
    ex.printStackTrace();
    }
    finally [
    fos.close();
    oos.close();
    }
    Je suppose que quand je teste sur linux, ce dernier travaille directement en UTF8 contrairement à windows qui utilise probablement le charset ISO-8859 mais je ne sais pas comment rendre le fonctionnement identique entre les 2 systèmes. Auriez vous une solution à me soumettre ?

    Merci d'avance !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Il est à noter, que lorsque j'exécute mon appli via le debugger de Netbeans ... l'encodage ne pose pas de problème, même sur windows ... mais une fois que je compile et que j'utilise l'appli avec un "java -jar ..." le problème d'encodage est toujours là (pour l'export XML, je ne débug pas encore la sauvegarde ne sachant pas encore comment m'y prendre, et je préfère traiter un problème à la fois)

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par nuts62 Voir le message
    Pour l'instant je n'ai travaillé qu'à débugguer l'export xml en créant une String sensée être formattée en UTF-8
    Deux choses :
    - on ne dit pas tellement "formatté" mais "encodé". Pour dire comment c'est encodé on peut aussi parler du "charset" utilisé. UTF-8, ISO-8859-1, autre...

    - Une String n'a pas de charset. Les charsets c'est des histoires d'octets, or une String est une séquence de chars, pas d'octets. Une String n'a pas de charset. Elle n'est ni en UTF-8 ni en ISO-8859-1 ni en rien. Elle est du texte. Les charsets interviendront quand on voudra transformer du texte en octets ou des octets en texte. Ce n'est pas le cas d'une String

    [quote=nuts62;5550740]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     String xml = new String(xmlWithSpecialChars.getBytes(), "UTF-8");
    Du coup, ça typiquement ça a l'air d'un bug.
    1/ Tu transformes ta String en octets dans le charset par défaut de la plate-forme,
    2/ tu considères que ces octets sont un flux UTF-8 et tu construis la String obtenue avec ce flux UTF-8.

    Conclusions :
    - Ça ne peut marcher correctement que si le charset par défaut de la plate-forme est UTF-8
    - Ça consiste à transformer une String en une autre String qui n'a pas de différence avec la première. Autant ne rien faire, c'est beaucoup plus sûr et moins long. À la limite tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // deux String distrinctes au contenu identique
    String xml = new String(xmlWithSpecialChars);
    Quand à la partie "enregistrement" de mes objets je le fais de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try{
    File f= new File(...);
    fos = new FileOutputSteam(f);
    oos = new ObjectOutputStream(fos);
    oss.writeObject(monObjet);
    } catch(IOException ex){
    ex.printStackTrace();
    }
    finally [
    fos.close();
    oos.close();
    }
    Je ne vois pas de soucis d'encodage là-dedans.

    Je suppose que quand je teste sur linux, ce dernier travaille directement en UTF8 contrairement à windows qui utilise probablement le charset ISO-8859 mais je ne sais pas comment rendre le fonctionnement identique entre les 2 systèmes. Auriez vous une solution à me soumettre ?
    Les linux modernes tournent pas mal en UTF-8 par défaut, oui. Les Windows de chez nous tournent en windows-1252, un sur-ensemble de ISO-8859-1, par défaut.

    Pour garder un fonctionnement identique, il ne faut jamais utiliser de méthode qui repose sur le charset par défaut.
    Par exemple, ne jamais utiliser string.getBytes(), et le remplacer par string.getBytes("UTF-8") par exemple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Tout d'abord, désolé pour l'abus de langage je me suis fourvoyé et probablement un un peu embrouillé avec tout ce que j'avais pu lire dans mes recherches avant de poster.

    Pour le getBytes du coup je suis d'accord avec toi maintenant que tout ça est plus clair, notamment son fonctionnement. J'ai donc appliqué ce que tu m'as indiqué, et ça semble marcher, je vais tester sur plusieurs plateformes afin de m'en assurer.

    Pour la dernière partie, je l'avais exposée car j'avais peur qu'elle soit soumise à des problèmes d'encodage après ce que j'avais pu lire. Mais il semblerait qu'il n'y avait pas de lien, merci de m'en avoir confirmé le bon fonctionnement

    En tout cas merci pour ton aide, j'espère que ces problèmes d'encodages ne referont pas surface !

Discussions similaires

  1. encodage fichier csv problématique sous windows
    Par marco056 dans le forum Général Python
    Réponses: 15
    Dernier message: 01/05/2015, 19h10
  2. Problème d'encodage sous Windows / Linux
    Par robert_trudel dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/09/2009, 17h30
  3. Encodage UTF-8 sous windows
    Par cancrat dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2007, 15h35
  4. [Utilisation] Probleme encodage sous windows
    Par tittoto dans le forum Subversion
    Réponses: 2
    Dernier message: 28/05/2007, 09h44
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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