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 :

pb encodage utf8 après compilation


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut pb encodage utf8 après compilation
    Bonjour tout le monde,

    J'ai fait un programme qui utilise Apache HTTPComponents pour récupérer des données perso de manière automatisée sur un site, que je rentre ensuite dans un fichier Excel au moyen d'Apache POI. Jusqu'ici tout va bien, les données sont encodée au bon format (utf8).

    Comme je n'arrivais pas à inclure les librairies Apache que j'ai utilisé en compilant avec Eclipse, j'ai utilisé le plug-in FAT JAR. Ca marche pile poil, sauf qu'une fois compilées mes données ne sont plus au format utf8 (é à la place de é). Je ne sais pas où et comment spécifier qu'elles doivent être en utf8. Je ne sais si ça vient de la configuration des librairies Apache, d'Eclipse, ou de Fat Jar. Quelqu'un aurait-il une idée?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    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 481
    Points : 48 806
    Points
    48 806
    Par défaut
    L'erreur é pour é est une erreur de lecture d'un fichier utf-8 avec décodeur utilisant de l'ISO-8859-1 ou similaire, l'erreur est donc à chercher dans le code de lecture depuis le site web. POI va utiliser les format interne de Excel et n'est donc a priori pas en cause.

    Peux-tu nous montrer comment tu lit tes String depuis le site web? Tu précise bien explicitement d'utiliser l'UTF-8 ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'utilise un DefaultHttpClient que je transmet d'une classe à l'autre :
    DefaultHttpClient httpClient = new DefaultHttpClient();

    J'utilise une méthode connexionPage en mode POST pour récupérer le code de la page dans une HttpResponse :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    	public void connexionPage(int methode) {
     
    		HttpResponse reponse = null;
    		if (methode == POST) {
    			HttpPost httpost = new HttpPost(this.url);
    			HttpContext localContext = new BasicHttpContext();
     
    			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
    			for(Info inf : this.listeInfo){
    				nvps.add(new BasicNameValuePair(inf.getName(), inf.getValue()));
    }
    			System.out.println("Connecting to : "+this.url);
    			try {
    				httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
     
    			try {
    				reponse = this.httpClient.execute(httpost,localContext);
    				System.out.println(reponse.getStatusLine().toString());
    				Header locationHeader[] = reponse.getHeaders("location");
    				for(int i=0;i<locationHeader.length;i++){
    					System.out.println("loc "+i+" "+locationHeader[i]);
    				}
    				Header header[] = reponse.getAllHeaders();
    				for(int i=0;i<header.length;i++){
    					System.out.println(i+" "+header[i]);
    				}
    				if(locationHeader.length==1){
    					reponse.getEntity().consumeContent();
    					HttpGet httpGet = new HttpGet(locationHeader[0].getValue());
    					reponse = this.httpClient.execute(httpGet);
     
     
    			} catch (ClientProtocolException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			InputStream data = null;
    			try {
    				data = reponse.getEntity().getContent();
    			} catch (IllegalStateException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			this.assemblageDonnees(data);
    			listeCookies = this.httpClient.getCookieStore().getCookies();
     
    		} 
    	}
    Je transforme l'HttpResponse en String avec la méthode assemblageDonnees :

    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
    private void assemblageDonnees(InputStream stream) {
     
    		InputStreamReader reader = new InputStreamReader(stream);
    		BufferedReader buffer = new BufferedReader(reader);
    		StringBuilder sb = new StringBuilder();
    		try {
    			String cur;
    			while ((cur = buffer.readLine()) != null) {
    				sb.append(cur + "\n");
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		try {
    			stream.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		this.donnees = sb.toString();
    	}
    Je ne précise nulpart que c'est de l'utf8, pourtant quand je lance sous Eclipse ça lit bien en UTF8, c'est juste une fois compilé.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    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 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu dois remplacer ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		InputStreamReader reader = new InputStreamReader(stream);
    		BufferedReader buffer = new BufferedReader(reader);
    		StringBuilder sb = new StringBuilder();
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		InputStreamReader reader = new InputStreamReader(stream,encodage);
    		BufferedReader buffer = new BufferedReader(reader);
    		StringBuilder sb = new StringBuilder();
    encodage est à déterminer suivant les règles suivantes:

    si HttpEntity.getContentEncoding() te retourne une valeur, l'utiliser (après tout, rien ne te garanti que dans le futur le serveur enverra toujours sa réponse en utf-8). Si le serveur n'a pas renseignée le contentEncoding, alors utiliser le défaut qui te semble raisonnable (dans ton cas utf-8).


    Dans tous les cas, si tu ne précise pas l'encodage dans new InputStreamReader, l'encodage sera celui "par défaut de la plateform", ce qui est hautement variable, comme tu l'a constaté, et donc à éviter.

  5. #5
    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
    Je me permets d'ajouter :

    Si un code Java s'exécute, alors il est compilé.
    Il n'y a donc rien qui change "une fois compilé" puisque le code était déjà compilé avant d'être essayé de quelque manière que ce soit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup Tchize, ça a fonctionné. Il fallait que je passe le format en paramètre dans le reader. Par contre il a fallu que j'aille lire le charset dans le Content-Type avec
    Header contentTypeHeader[] = reponse.getHeaders("Content-Type");

    car HttpEntity.getContentEncoding() est null.

    Bisou!

Discussions similaires

  1. Erreur d'encodage après compilation
    Par Glandelf dans le forum Qt Creator
    Réponses: 2
    Dernier message: 03/02/2014, 09h17
  2. Pb encodage UTF8 après compilation
    Par AZIZFOLIES dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 09/07/2010, 15h53
  3. [DEBUTANT] [APPLET] Probléme aprés compilation !
    Par crazyman8 dans le forum Applets
    Réponses: 5
    Dernier message: 13/01/2006, 18h18
  4. Problême après compilation du projet !
    Par Osiris26 dans le forum Access
    Réponses: 3
    Dernier message: 01/11/2005, 00h45
  5. Problème X après compilation noyau 2.6.13.2
    Par nicodeme dans le forum Applications et environnements graphiques
    Réponses: 9
    Dernier message: 08/10/2005, 14h41

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