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 :

Encore un problème d'encodage !


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 24
    Points
    24
    Par défaut Encore un problème d'encodage !
    Bonjour, je suis sous macosx.

    voici ce que fais mon programme :
    1.j'écris qqch dans une JTextArea(un mot comportant un accent disons).
    2.le mot est récupéré avec la méthode getText() depuis celle-ci,
    3.puis il sert à récupéré un autre mot en provenance d'une page web, lui aussi est accentué.
    4. Ce nouveau mot est imprimé dans la JTextArea.

    voici ce que j'obtiens pour l'accent é : È.

    J'imagine qu'à l'étape 4, le nouveau mot, avant qu'il soit imprimé dans la JTextArea est encodé en MacRoman (encodage par défaut des macs.).
    Alors j'ai décidé d'ajouter une fonction à mon programme afin de convertir le nouveau mot vers l'UTF-8. La voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private String toUTF8(String _oldString){
    		String _newString = null;
    		try{
    			byte[] _bytes = _oldString.getBytes(System.getProperty("file.encoding"));
    			_newString = new String(_bytes, "UTF8");
    		}catch( java.io.UnsupportedEncodingException _uee ){
    			_uee.printStackTrace();
    		} 
    		return _newString;
    	}
    Mais alors, pour l'accent é, j'obtiens : �


  2. #2
    Expert éminent sénior
    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 : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    tu dois décoder ce qui viens de la page web avec l'encodage utilisé par cette page web. Inutile d'essayer de "rattraper" la String après, c'est trop tard.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    merci pour ta réponse tchize.

    Il s'avère que les jtextarea ne supportent pas l'unicode mais le ISO-8859-1 !.

    par exemple (et à condition que le fichier .java soit encodé en unicode et qu'on ajoute à javac "-encoding UTF8");

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String s = "à côté";
    		byte[] b = s.getBytes();
    		String s2 = null;
    		try{
    			s2 = new String(b,"UTF-8");
    		}catch(UnsupportedEncodingException e){e.printStackTrace();}
     
    		_text.append(s2);
    affiche : � c�t�

    par contre, comme je l'ai dit avec l'ISO-8859-1, tout baigne :

    je poste donc ma méthode pour chopper une page web encodée en ISO-8859-1, et la traduire dans l'encodage du système (qui est utilisé par défaut par java).

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    private String get(URL _url) {
    		String _source = null;
     
    		try {
    			//prepares the connection and opens it
    			HttpURLConnection _httpCon = (HttpURLConnection) _url.openConnection();
    			_httpCon.addRequestProperty("User-Agent", "Mozilla/5.0"); //masquarade
    			_httpCon.addRequestProperty("Accept-Language", "fr");
    			InputStream _in = _httpCon.getInputStream();
    			//used to store the page before decoding it
    			ByteArrayOutputStream _out = new ByteArrayOutputStream(4096);
                byte [] _buf = new byte[4096];
    			int i;
                while((i = _in.read(_buf)) > -1)
                    _out.write(_buf, 0, i);
     
    			_httpCon.disconnect();
                _in.close();
     
    			Charset _charset = Charset.forName("ISO-8859-1");
    			CharsetDecoder _decoder = _charset.newDecoder()
                .onMalformedInput(CodingErrorAction.REPLACE)
                .onUnmappableCharacter(CodingErrorAction.REPLACE);
     
    			ByteBuffer _bb = ByteBuffer.wrap(_out.toByteArray());
    			_out.close();//does nothing, but arggggl
                _source = _decoder.decode(_bb).toString();
    		}
    		catch (MalformedURLException _mue) {
    			_mue.printStackTrace();} 
    		catch (IOException _ioe) {
    			_ioe.printStackTrace();}
    		//catch (UnknownHostException _uhe) {
    		//	_uhe.printStackTrace();}
     
    		return _source;
    	}
    enfin, lorsque l'on déclare le Charset, on peut essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Charset _charset = Charset.forName(_httpCon.getHeaderField("Content-encoding"));
    mais tous les serveurs ne fournissent pas l'encodage de ce qu'ils servent.
    De plus il n'existe pas de méthode fiable pour définir l'encodage des pages, le plus souvent cela est déterminé statistiquement.


    .


    Pour poursuive, comment peut on faire pour qu'une JTextArea accepte les caractères unicodes ? Suffit-il d'y définir une police unicode ?

  4. #4
    Expert éminent sénior
    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 : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par Phonatacid Voir le message
    Il s'avère que les jtextarea ne supportent pas l'unicode mais le ISO-8859-1 !.
    JTextArea n'a pas d'encodage, il utilise des string java et par conséquence, il n'utilise que l'encodage interne de la jvm, qui est spécifique (une variante d'UTF-16 si ma mémoire est bonne) mais ce n'est pas ton affaire.

    par exemple (et à condition que le fichier .java soit encodé en unicode et qu'on ajoute à javac "-encoding UTF8");
    'encodé en unicode' ne veux rien dire, dans quel encodage est ton fichier .java? l'argurment -encoding doit correspondre à l'encodage utilisé par ton IDE / editeur de fichier / autre utilisé pour générer le .java, c'est tout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String s = "à côté";
    		byte[] b = s.getBytes();
    		String s2 = null;
    		try{
    			s2 = new String(b,"UTF-8");
    		}catch(UnsupportedEncodingException e){e.printStackTrace();}
     
    		_text.append(s2);
    affiche : � c�t�
    Ce code n'a aucun sens, tu va prendre la string "à coté", en faire de bytes avec une méthode non recommandée qui prendra l'encodage par défaut de ta plateforme (par exemple cp850) et "essayer" de faire lire ce stream de byte avec UTF-8 ce qui est incohérent, l'utf-8 n'est pas du cp850. Ca n'aura de sens que dans le cas particulier ou l'encodage par défaut de la plateforme est utf-8. Dans ce cas tu ne fera que recréer exactement la même String. Ce code suivant est le bon pour stocker du texte dans un JTextArea:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = "à côté";
    textarea.append(s);
    je poste donc ma méthode pour chopper une page web encodée en ISO-8859-1, et la traduire dans l'encodage du système (qui est utilisé par défaut par java).
    Le code suivant est suffisant et plus simple à utiliser


    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
    24
    25
    26
    27
    28
    29
    30
    private String get(URL _url) {
    		String _source = null;
     
    		try {
    			//prepares the connection and opens it
    			HttpURLConnection _httpCon = (HttpURLConnection) _url.openConnection();
    			_httpCon.addRequestProperty("User-Agent", "Mozilla/5.0"); //masquarade
    			_httpCon.addRequestProperty("Accept-Language", "fr");
    			InputStream _in = _httpCon.getInputStream();
    			//used to store the page before decoding it
    			ByteArrayOutputStream _out = new ByteArrayOutputStream(4096);
                byte [] _buf = new byte[4096];
    			int i;
                while((i = _in.read(_buf)) > -1)
                    _out.write(_buf, 0, i);
     
    			_httpCon.disconnect();
                _in.close();
     
    			return new String(_out.toByteArray(),"ISO-8859-1");
    		}
    		catch (MalformedURLException _mue) {
    			_mue.printStackTrace();} 
    		catch (IOException _ioe) {
    			_ioe.printStackTrace();}
    		catch (UnsupportedEncodingException ex) {
    		//	ex.printStackTrace();}
     
    		return _source;
    	}
    Pour poursuive, comment peut on faire pour qu'une JTextArea accepte les caractères unicodes ? Suffit-il d'y définir une police unicode ?
    Voir plus haut, je JTextArea n'a aucune notion d'encodage, comme 99.9% des méthodes java, il travaille avec des string java. Si ton texte ne s'affiche pas correctement dans un JTextArea et que la String est correcte, c'est que les caractères en question ne sont pas supportés par ta police d'affichage.

Discussions similaires

  1. [Lazarus] Encore des problèmes d'encodage
    Par Francois_C dans le forum Lazarus
    Réponses: 6
    Dernier message: 07/01/2015, 10h02
  2. Encore un problème d'encodage de caractéres
    Par Memelo dans le forum Administration
    Réponses: 0
    Dernier message: 07/10/2010, 10h53
  3. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  4. Réponses: 8
    Dernier message: 10/08/2004, 11h49
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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