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 :

Bizarrerie avec FileReader ?


Sujet :

Java

  1. #1
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Bizarrerie avec FileReader ?
    Bonsoir,

    Je me tourne vers vous face à un problème que je ne comprends pas. Cela concerne l'encodage des fichiers textes. Pour faire simple, j'ai écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class testeur {
     
        public static void main(String args[]) {
            try {
                FileReader lecteurFichier = new FileReader("C:\\Documents and Settings\\thierry\\Bureau\\releve javasound.txt");
                System.out.println(lecteurFichier.getEncoding());
                }
            catch (Exception e) {}
            }
    }
    Je suis sous Windows XP, et j'ai créé dans un premier temps ce fichier avec le Notepad sans me préoccuper de son encodage, donc, ce dernier a été enregistré dans le standard Microsoft cp1252.
    J'exécute le code ci-dessus, et tout naturellement, j'obtiens en sortie, cp1252.
    J'ouvre à nouveau mon fichier texte, toujours avec Notepad, et je le ré-enregistre en précisant cette fois un encodage UTF-8. Je relance mon code, et j'obtiens toujours cp1252 ??
    Je recommence, et cette fois j'opte pour Unicode. Même chose...
    En clair, quel que soit l'encodage du fichier texte, lorsque j'interroge FileReader, ce dernier me renvoie toujours cp1252 ???

    Quelqu'un serait-il en mesure de m'expliquer pourquoi ??

    Un grand merci d'avance.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Attention:
    FileReader, ou plus exactement InputStreamReader (la classe parente), la méthode "getEncoding()" retourne l'encodage utilisé pour lire le fichier, mais pas l'encodage qui a été utilisé lors de l'enregistrement du fichier
    D'ailleurs, en Java natif (c'est à dire avec une classe disponible dans le JDK), il n'y a pas moyen de récupérer directement l'encodage d'un fichier.
    Ainsi, vu que (en supposant que) sous windows, l'encodage par défaut est cp1252, c'est ce qui va être utilisé par défaut pour lire les fichiers, SAUF SI tu spécifies toi même l'encodage à utiliser pour la lecture lorsque tu fais par exemple un truc du genre
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("fichier.txt")), "utf-8");
    ...
    Ceci dit, si tu veux faire cela, il y'a des lib gratuites pour cela.
    Voilà
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  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,


    Les fichiers textes ne comportent aucune information quand à leur encodage. Du coup il ne peut pas être "détecté" de manière simple.

    L'encodage retourné par la méthode getEncoding() correspond à l'encodage par défaut de ton système. En effet c'est cet encodage qui est utilisé lorsque tu n'en précises aucun.


    Pour utiliser un autre encodage, il faut le préciser explicitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reader lecteurFichier = new InputStreamReader(new FileInputStream("...javasound.txt", "UTF-8"));

    Maintenant si tu veux le détecter automatiquement c'est plus complexe...
    La meilleure solution serait de passer par une librairie externe comme juniversalchardet.



    a++

  4. #4
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Un grand merci.
    C'est malheureusement ce que je craignais. Il m'avait effectivement semblé comprendre que l'encodage renvoyé correspondait à celui du système, et pas du fichier. Je vais donc très rapidement visiter le site que vous me suggérez adiGuba. En effet, mon application est destinée à réceptionner des fichiers provenant de tous horizons, donc j'aurai droit à tous les type d'encodage...

    Merci à vous deux en tous cas.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par pursang Voir le message
    En effet, mon application est destinée à réceptionner des fichiers provenant de tous horizons, donc j'aurai droit à tous les type d'encodage...
    Fais quand même des efforts pour essayer de réceptionner l'encodage de ces fichiers, en même temps que les fichiers eux-mêmes. Genre te mettre d'accord avec les gens qui t'en envoient, pour qu'ils envoient aussi l'encodage à côté, comme faisant partie du protocole d'échange.

    Ça marche beeeeaaaaaauuuuuucoup mieux. Tu te feras moins de cheveux gris.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Merci Thelvin
    Pour ce qui est des cheveux gris, c'est déjà le cas depuis quelques années... et oui, passé la quarantaine, enfin bref. Dans mon cas, les protagonistes sont des utilisateurs lambda d'un petit logiciel que je mets au point pour réaliser un partage d'écran. En fait, la partie client de mon projet affiche sur l'écran de son utilisateur un mini-écran contenant l'image de l'écran partagé. L'idée est de lui permettre par un simple glissé-posé d'envoyer en quelque sorte un fichier sur l'écran partagé. Pour l'instant, j'en suis au support des fichiers textes et images qui sont simple a traiter. Sauf que voilà, dans sa manipulation, l'utilisateur devrait alors répondre à la question de l'encodage. Cela ne me convient pas, j'estime que la machine doit être capable de se débrouiller toute seule pour si peu. J'ai donc suivi la direction indiquée par adiGuba et récupéré une petite librairie (juniversalchardet-1.0.3.jar) qui m'offre une classe utilitaire parfaite pour moi qui me permet de déterminer l'encodage du fichier déposé. En effet, pour l'afficher correctement sur l'écran partagé, il me faut celons le cas fixer le bon encodage.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bon, ben, tu as fait ce que tu as pu, comme je te l'ai conseillé.
    Si c'est pas possible c'est pas possible, 'faudra faire avec l'autodétection.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Bizarreries avec mon listener:TNS-12560
    Par pascal_T dans le forum Administration
    Réponses: 4
    Dernier message: 17/04/2007, 10h54
  2. Bizarrerie avec le ET logique (&)
    Par molotov dans le forum C
    Réponses: 16
    Dernier message: 19/03/2007, 00h13
  3. bizarrerie avec l'appel system read sous linux.
    Par Hypnocrate dans le forum C
    Réponses: 20
    Dernier message: 20/11/2005, 02h47
  4. [Delphi 6] Problème avec FileRead
    Par Jean-Jacques Engels dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2005, 14h11
  5. bizarreries avec le port serie
    Par Invité dans le forum MFC
    Réponses: 3
    Dernier message: 20/10/2005, 17h35

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