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

Entrée/Sortie Java Discussion :

Encoding et FileInputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut Encoding et FileInputStream
    Bonjour,

    Je dois lire un fichier contenant des caracteres accentues. Ils ont ete generes avec un editeur suppose gerer l'encodage utf-8.

    J'utilise les classes suivantes:

    FileInputStream
    BufferedReader
    InputStreamReader

    Je peux facilement (sans preciser d'encodage aux readers) recuperer les caracteres accentues dans une String. J'utilise egalement BufferedReader.readLine() sans preciser l'encodage. Maintenant que cela a ete converti en utf-16, comment transcoder vers de l'ASCII ? Pour resumer, j'obtiens Lú et je voudrais Lú.

    Si vous avez de bons pointeurs sur les bases de l'encodage, je suis plus que preneur...

    Merci,

    kim

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    perso pour les rares cas ou j'ai eu besoin d'utiliser multitudes d'encodages, j'ai utilisé java.nio.charset.*
    Maintenant, ton problème semblant "relativement" simple, il me semble qu'il n'est pas utile de passer par ce package.
    Je laisse ma place aux connaisseurs.
    PS n'hésite pas si tu veux des précisions sur nio.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    Un grand merci pour ta reponse iohack,

    Effectivement mon probleme est "tout bete" et il doit y avoir moyen de gerer ca plus "simplement" (appel aux connaisseurs). Peut etre au niveau du stream en gerant des bytes (?)... mais les coder pour obtenir Lú en place de Lú me depasse. Ta solution semble plus simple. Mon probleme est que ne sais meme pas quel encodage est utilise dans mon cas . Je sais juste que c'est code comme ca dans la base de donnees que j'utilise. J'imagine que c'est sur 8 bits (???) vu qu'un caractere accentue dans la version utf16* donne 2 caracteres dans l'encodage desire. Une idee ?

    J'ai jete un coup d'oeil a http://java.sun.com/j2se/1.4.2/docs/...etEncoder.html.
    qui parait bien sympathique (merci pour la reference ). Malheureusement, la liste de charsets ne propose rien qui me semble aller...
    Pourrais-tu m'aiguiller sur la marche a suivre avec java.nio stp ?

    J'ai essaye "US-ASCII" qui semblait "le moins pire" en precisant l'encodage au niveau de l'InputStreamReader

    new InputStreamReader(fileInputStream, "US-ASCII"));

    ca ne semble pas marcher mais peut etre faut-il mieux d'abord passer en utf16* et ensuite utiliser un CharsetEncoder ?

    * = Une question de base (de boulet plutot ) pour tenter de comprendre: si on utilise InputStreamReader(FileInputStream), sans preciser d'encodage donc, le stream 'transcode' du format par defaut du systeme vers utf-16 qui est l'encodage utilise par Java. Est-ce bien ca ?

    Merci !

  4. #4
    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,

    Citation Envoyé par KillMePlease
    * = Une question de base (de boulet plutot ) pour tenter de comprendre: si on utilise InputStreamReader(FileInputStream), sans preciser d'encodage donc, le stream 'transcode' du format par defaut du systeme vers utf-16 qui est l'encodage utilise par Java. Est-ce bien ca ?
    Oui tout à fait !
    Dès que tu utilises une String il y a un encodage en UTF-16, et l'InputStreamReader se charge de cet encodage...


    Mais ensuite il faut refaire l'opération inverse lorsque tu veux enregistrer ta String, en utilisant un OutputStreamWriter...

    a++

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    Merci pour la confirmation et pour avoir bouge le message au bon endroit .

    Petit a petit je commence q comprendre
    Aucune idee pour cet encodage bizarre que je veux obtenir ?

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    J'ai trouve les correspondances suivantes:

    Latin1 UTF-1 UTF-8 UTF-7,5 UTF-7 JAVA HTML
    ú ú ú £ú +APo- \u00fa ú

    Ce que je veux donc, je pense, c'est la representation utf-8 de mes String (pas si bizarre que ca l'encodage ).
    Est-ce qu'utiliser un CharsetEncoder vers de l'utf-8 peut marcher ?
    Si c'est la marche a suivre, iohack, j'accueille avec joie ta proposition d'aide stp...

  7. #7
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Charset charset=Charset.foreName("UTF-8");
    CharsetEncoder encoder=charset.newCharsetEncoder();
    ByteBuffer bb=encoder.encode(monCharBuffer)
    // A ce moment, bb contient ton charBuffer encodé en UTF8, il ne te reste plus qu'à l'envoyer là où tu veux.

  8. #8
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    Merci beaucoup pour ta solution et pour ta patience .
    Beaucoup d'inepties dans mes precedent posts. Desole pour le boulet. Pour tenter, une derniere fois, de clarifier mon probleme, voici une bref description , ou tout du moins une description de ce que j'ai cru comprendre.

    J'utilise une base pour laquelle les enregistrements en UTF-8 ont ete transcodes automatiquement a l'insert (a cause du charset par defaut) en latin 1. Par exemple, "cú" est devenu "cú". Je n'administre pas cette base.

    L'utilisateur fournit une liste de String dans un fichier texte. Ces String seront utilises dans des clauses WHERE de requetes sur les tables "transcodes". Je force l'utilisateur a utiliser un encodage UTF-8 pour ce fichier.

    Dans l'application, au moment des requetes. Je dois donc au final me retrouver avec les String encodes au meme format que dans la base i.e. "cú" au lieu de "cú".

    *Une* solution qui semble marcher mais qui me semble pas top (peut etre vaudrait-il mieux que j'utilise ta methode ?) :

    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
     
     
    		try {
    			FileInputStream fis = new FileInputStream(file);
    			BufferedReader buffReader = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
    			String line = null;
     
    			while ((line = buffReader.readLine()) != null) {
    				byte[] myFinalBytes = new String(line.getBytes(),"ISO-8859-1").getBytes("UTF-8");
    				String lmyFinalString = new String(myFinalBytes);
    			}
    			buffReader.close();
    			fis.close();
    		} catch (IOException ex) {
    			ex.printStackTrace();
    		}
    Toutes remarques/corrections bienvenues.

    merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/01/2005, 17h38
  2. [FileInputStream] readObject
    Par schousso dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 27/05/2004, 15h21
  3. [encoding] symbole €
    Par phoebe dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 11/05/2004, 16h57
  4. Réponses: 4
    Dernier message: 07/05/2004, 21h15
  5. [JSP] encoder et décoder les param d'une URL ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 22/12/2003, 11h34

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