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

avec Java Discussion :

Encodage des caractères depuis un jar


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    IT in outer space
    Inscrit en
    Novembre 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : Novembre 2006
    Messages : 88
    Par défaut Encodage des caractères depuis un jar
    Bonjour.
    Dans le cadre de mon étude des sockets en Java j'ai repris les codes proposés par les tutoriels du site officiel de Java que j'ai un peu modifié pour m'essayer à certaines autres choses qui me tiennent personnellement à cœur dont l'internationalisation/localisation des applis et donc leur encodage.

    Comme toujours je travailles sous Eclipse mais je génères mes jar exécutables avec un petit script (plus simple, plus rapide AMHA).

    D'ailleurs si ça peut intéresser quelqu'un servez-vous (et adaptez) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @echo off
    cd bin
    jar cvfm SocketthrdServer.jar ../SVRMANIFEST images lang Server
    jar cvfm SocketClient.jar ../CLIMANIFEST Client
    move /Y *.jar ..
    Enfin le problème c'est que l'appli fonctionne très bien quand elle est lancée depuis Eclipse mais quand je lance depuis les jar que j'ai généré mes kanji sont remplacés par des points d'interrogation.

    J'ai téléversé des images pour vous montrer le problème. A ne pas confondre avec les différences de codage entre telnet et le serveur (c'est un peu normal et ça n'est pas le problème même si je reste intéressé si quelqu'un aurait des infos dessus) je pose bien la question par rapport aux messages entre les clients et le serveur programmés en java.
    Voilà pour les images.
    http://yfrog.com/bhcapture20100706131050px

    Descriptions des images (de gauche à droite) :

    1. Essai depuis Eclipse. Le popup (non visible sur l'image) indique UTF-8 et tout marche bien.
    2. Essai depuis les versions jar. Le popup (non visible...) indique cp1252 (Latin-1). Je prépares une petite phrase en japonais pour tester.
    3. Mes caractères sont affichés comme des points d'interrogation.
      Notez que l'interface est elle bien affichées en japonais.
      Je prépares une petite phrase en français avec car. spéciaux pour tester.
    4. La locale du système étant la bonne, les caractères s'affichent.


    J'ai aussi remarqué que quelqu'un avait le même comportement au niveau du jar (cf. ici)et j'ai utilisé la même méthode que lui pour obtenir les mêmes résultats (popup évoquée ci-dessus).

    En gros pour une raison inconnue mon appli utilise UTF-8 depuis Eclipse mais utilise la locale du système soit Latin-1 depuis le jar exécutable. (Pas testé sous Linux mais je suppose qu'il ne devrait pas y avoir de problème vu que de mémoire j'utilise UTF-8).
    J'ai parcouru aussi bien le forum que le net mais je n'ai pas réussi à trouver grand chose.
    Je voudrais savoir s'il existe un moyen pour que l'appli dans le jar utilise UTF-8 quelque soit le système au même titre que sous Eclipse. Le mieux serait sans passer par une ligne de commande externe mais bien en double cliquant sur l'icône du jar.

    Merci pour vos propositions, aide, solutions.

    EDIT:
    Comme je le pensais sous Linux l'appli fonctionne bien avec UTF-8.

  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 : 45
    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
    ça veux dire que l'encodage utilisé par ton application dépend de la plateforme, ce qui est mauvais en général, surtout pour du client serveur. C'est à toi d'imposer un encodage précis lorsque tu transformer tes caractère depuis et vers du binaire.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    L'encodage dépend en effet du système hôte. Eclipse peut le changer en UTF-8 selon la configuration, mais de manière général c'est plutôt à éviter.

    De toute manière cet encodage ne concerne que les flux entrés/sortie. Si tu as besoin d'un encodage spécifique il vaut mieux le définir dans ton code plutôt que d'impacter l'encodage par défaut.

    Quand aux interfaces graphiques en Swing, elles utilises de l'UTF-16 quoi qu'il arrive... D'ailleurs je ne vois pas de problème sur tes screenshots !?!?


    a++

  4. #4
    Membre confirmé
    Homme Profil pro
    IT in outer space
    Inscrit en
    Novembre 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : Novembre 2006
    Messages : 88
    Par défaut
    Donc en gros je dois imposer l'encodage en dur dans le code ?
    Bon ben reste plus qu'à chercher un peu dans la doc de l'API...
    Est-ce que ça veut dire que je vais devoir préciser l'encodage à chaque fois que j'ai un flux ? N'y a t'il pas une méthode simple pour appliquer l'encodage à toute l'application comme par exemple une clause à mettre dans le manifest ou dans la main de l'appli ou similaire ?
    Merci.

    EDIT:
    Je viens de trouver plusieurs solutions.
    Dont lancer l'appli avec l'option -Dfile.encoding=UTF8 mais ça garde la fenêtre du script ouvert et c'est donc pas très beau.

    Par contre j'ai trouvé cette info vraiment très utile dans les tutoriels et cours de formation pour bien apprendre Java.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.setProperty( "file.encoding", "UTF-8" );
    Le popup affiche utf8 mais j'ai toujours les points d'interrogation avec la ligne de code à la place de mes caractères... Là je ne comprend plus. >< Ça n'affècte pas toute l'application ?

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Je te déconseillerais plutôt d'utiliser "file.encoding". En règle général il faut utiliser celui par défaut qui correspond à celui du système... sinon tu pourrais rencontrer encore plus de problème.


    Quel est exactement ton problème ? Je ne vois rien d'anormal sur les screenshot de tes popup !?


    a++

  6. #6
    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 : 45
    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 Pasokoniidesuka Voir le message
    Donc en gros je dois imposer l'encodage en dur dans le code ?
    PAs spécialement "en dur", tout dépend du but, ca peut etre aussi via un fochioer de config et ton utilisateur choisirais ses préférence d'encodage, a voir suivant le besoin.

    Est-ce que ça veut dire que je vais devoir préciser l'encodage à chaque fois que j'ai un flux ?
    Oui, c'est comme ça qu'on fait quand on code proprement, on précise toujours l'encodage du Reader/Writer, a moins d'avoir une bonne raison d'utiliser "l'encodage par défaut" (comme par exemple lire des ficheir système dont tu suppose que l'OS aura utilisé son encodage par défaut pour le créer.

  7. #7
    Membre confirmé
    Homme Profil pro
    IT in outer space
    Inscrit en
    Novembre 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : Novembre 2006
    Messages : 88
    Par défaut
    OK merci.
    J'ai cherché pas mal de choses à propos de l'encodage hier que j'ai mis de côté pour lire plus tard.
    Juste pour préciser mon petit souci de hier. J'ai lu quelque chose qui explique pourquoi ça ne marche pas.
    Si ça marche en lançant le jar par la ligne de commande java -jar nomdujar.jar -Dfile.encoding=UTF-8 mais pas avec System.setProperty("file.encoding","UTF-8"); c'est parce qu'une fois que la VM est lancée, on ne peut pas changer dynamiquement l'encodage par défaut. Comme dans le cas d'un passage par ligne de commande le VM n'est pas encore lancée ça peut passer mais avec setProperty ça ne peut pas car cela suppose qu'on soit déjà en train d'exécuter le programme donc que la VM est lancée.

    Sinon j'ai remplacé mon code par ceci et ça marche très bien depuis le jar. Je n'ai plus de points d'interrogation à la place de mes caractères.
    Voici mes anciennes puis mes nouvelles lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
    J'ai testé avec des échantillons de plusieurs langues et tout passe bien.

    http://yfrog.com/5hjavasocketutf8okp


    Merci pour votre aide.

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

Discussions similaires

  1. [JAR] Encodage des caractères d'un JAR
    Par Neikeur dans le forum NetBeans
    Réponses: 2
    Dernier message: 14/08/2007, 23h51
  2. [mysql]encodage des caractères
    Par ideal23 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/10/2006, 13h16
  3. Probleme d'encodage des caractères spéciaux
    Par pacoulitou24 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/06/2006, 16h47
  4. Réponses: 15
    Dernier message: 24/02/2006, 14h17

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