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 :

Connaitre l'encodage d'un fichier .txt


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut Connaitre l'encodage d'un fichier .txt
    Bonjour,

    dans une de mes applications j'utilise un fichier .txt pour alimenter une liste d'objet, normalement ce fichier est encodé en UTF-8 (encodage par défaut défini dans mon workspace etc...) mais un gentil utilisateur ( ) à trouvé le moyen d'utiliser un fichier avec un autre encodage, évidement cela a conduit a un beau gloubi boulga lors de l'alimentation de ma liste d'objet... J'ai tenté de résoudre ce problème en forcant l'encodage en utf-8 de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Lit le contenu du fichier en entrée
    InputStream is = myUploadedFile.getInputStream();
    InputStreamReader isr = new InputStreamReader(is, "UTF-8");
    BufferedReader br = new BufferedReader(isr);
    Mais ce code fait le contraire de ce que je voudrais en fait, c'est a dire qu'il lit le fichier comme s'il était en utf-8...

    Alors que ce que je voudrais ressemblerait plutôt à ca : (attention code complétement bidon qui ne fonctionnne pas mais qui représente ce que j'aimerais avoir ^^)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Lit le contenu du fichier en entrée
    InputStream is = myUploadedFile.getInputStream();
    String encodage = is.getEncoding();
    InputStreamReader isr = new InputStreamReader(is, encodage);
    BufferedReader br = new BufferedReader(isr);
    Cette fonction getEncoding existe pour le InputStreamReader mais elle me renvoit a chaque fois l'encodage par défaut du workspace ou alors l'encodage que j'ai spécifié lors du new...

    Voila je ne sait pas si je suis très clair, n'hésitez pas à me demander des précisions, merci d'avance de votre aide!!

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Je crois qu'il n'y a pas de moyen certains à 100% pour connaître l'encodage d'un fichier. Une solution ne serait pas de faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    InputStream is;
    InputStreamReader isr;
    try {
      is = myUploadedFile.getInputStream();
      isr = new InputStreamReader(is, "UTF-8");
    } catch (Exception e) {
      // quand on arrive dans l'exception c'est que le fichier en question n'a pas le bon encodage
    }
    Mais je ne sais pas si ça envoie une exception dans ce cas.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    il n'y a pas de détection automatique des encodage en java. Soit tu fournis un encodage explicite lors de la création du Reader, soit c'est l'encodage par défaut de la plateforme qui est utilisé. Le premier restant préférable.

    Je ne connais pas d'algorithme de détection qui soit efficace à 100%
    Par exemple, si j'ouvre un fichier utf-8 avec un encodage iso-8859-1, je n'aurais aucune erreur de lecteur, juste des é remplacé par une paire de caractère. Mais cette paire de caractère peut aussi être légitime, comment faire la différence?

    Si tu t'attends à de l'utf-8 et que l'utilisateur a tendance à fournir du iso-8859-1, une solution serait
    1) ouvrir en utf-8
    2) tout lire
    3) si erreur de lecture, recommencer avec iso-8859-1

    Mais ça s'arrêtera là, iso ne déclenchera jamais d'erreur car chaque valeur de byte a une signification correcte (contrairement à utf-8) :/

  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 tchize_ Voir le message
    il n'y a pas de détection automatique des encodage en java.
    Une toute petite remarque : ce n'est pas propre à Java mais aux encodages en général, quel que soit le langage.


    Citation Envoyé par Robin56 Voir le message
    Mais je ne sais pas si ça envoie une exception dans ce cas.
    Malheureusement dans ce cas précis cela ne renvoi pas d'exception...

    Par défaut l'InputStreamReader ignore les caractères invalides et les remplacent par un autre caractère (un "?" en général).

    Pour pallier à cela il faut instancier explicitement le CharsetDecoder et forcer les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	CharsetDecoder decoder= Charset.forName("UTF-8").newDecoder();
    	decoder.onMalformedInput(CodingErrorAction.REPORT);
    	decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
    	final InputStreamReader input = new InputStreamReader(is, decoder);
    Désormais lors de la lecture la moindre erreur provoquera une exception !



    Le problème comme l'as indiqué tchize_ c'est que selon les codages cela ne provoque pas forcément d'erreur... car un même code peut représenter deux caractères différents dans deux encodages différents...


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Et bien merci a tous!!! Donc en effet pas possible de connaitre l'encodage du fichier ;-) Par contre le fait de lever une exception me plait bien, étant donné que les données sur lesquels je travaille ne contiennent que des caractères alphanumérique sans caractères spéciaux (accent etc...) je ne devrais pas avoir trop de problèmes...

    Donc merci encore une fois pour votre célérité, problème résolu pour moi ;-)

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,

    Citation Envoyé par tchize_
    il n'y a pas de détection automatique des encodage en java.
    Une toute petite remarque : ce n'est pas propre à Java mais aux encodages en général, quel que soit le langage.
    Il existe de-ci de-là des bibliothèques d'autodétection de charset. On ne peut pas compter sur leurs bons résultats, et je déconseille de s'en servir, mais ça existe.

    Par conséquent, il pourrait exister des langages qui intègrent ce genre de tentative directement, même si je n'en connais pas moi-même.
    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. Fichier txt et encodage
    Par guillaumeb13 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/01/2014, 19h52
  2. Comment connaitre l'encodage d'un fichier ?
    Par FyndWyre dans le forum Général Python
    Réponses: 5
    Dernier message: 06/07/2010, 15h22
  3. Encodage de fichier txt sur Linux pour Ada
    Par Invité dans le forum Ada
    Réponses: 7
    Dernier message: 12/02/2010, 10h03
  4. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 12h08
  5. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 01h19

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