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

Algorithmes et structures de données Discussion :

Détecter l'encodage d'un fichier texte


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut Détecter l'encodage d'un fichier texte
    bonjour,

    Comment fait-on pour détecter l'encodage d'un fichier texte (AINSI, UTF-8, UCS-2 little/big endian) ?
    Je programme en vb.net et j'ai posé la question sur le forum vb.net mais personne ne sait comment faire : c'est pourquoi je repose ma question ici...

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Normalement, il y a au début du fichier un BOM (byte order mark), c'est à dire une séquence d'octets:

    UTF8 : 3 premiers octets = EF BB BF
    UTF-16/UCS-2 (big-endian) : 2 premiers octets = FE FF
    UTF-16/UCS-2 (little-endian) : 2 premiers octets = FF FE
    ASCII/AINSI : pas de BOM, directement le contenu.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    ok merci pour l'info, je vais pouvoir me débrouiller

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emcy Voir le message
    Comment fait-on pour détecter l'encodage d'un fichier texte (AINSI, UTF-8, UCS-2 little/big endian) ?
    Il n'y a pas de methode universelle qui marche a tout les coups. Pour commencer,
    le code ASCII est un sous-ensemble strict de pas mal de codes (en commencant par celui que tu appelles ANSI -- enfin, je suppose que AINSI est une faute de frappe, c'est un code que je ne connais pas -- et UTF-8).

    Citation Envoyé par pseudocode Voir le message
    Normalement, il y a au début du fichier un BOM (byte order mark), c'est à dire une séquence d'octets:
    C'est pas normalement. C'est la convention utilisee par Windows, mais elle l'est rarement ailleurs parce qu'elle n'est pas sans probleme.

    UTF8 : 3 premiers octets = EF BB BF
    UTF-16/UCS-2 (big-endian) : 2 premiers octets = FE FF
    UTF-16/UCS-2 (little-endian) : 2 premiers octets = FF FE
    ASCII/AINSI : pas de BOM, directement le contenu.
    Ca doit marcher assez bien sous Windows pour autant que tous les fichiers proviennent de Windows et d'une version localisee pour un pays bien couvert par CP1252 (nom plus correct pour le code que les gens appellent generalement ANSI). Si des fichiers proviennent d'Unix, il faut tenir compte que le BOM n'est generalement pas present et qu'en France on trouve deja un joyeux melange de ISO 8859-1 et ISO 8859-15 en plus d'UTF-8; par contre UTF-16 et UTF-32 doivent etre quasiment absent des fichiers. Pour les autres pays (aussi exotiques que la Grece ou la Russie -- pas necessairement Chine Japon Koree), ca se complique encore plus.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    C'est pas normalement. C'est la convention utilisee par Windows, mais elle l'est rarement ailleurs parce qu'elle n'est pas sans probleme.
    Non, ce n'est pas une convention de Microsoft mais une convention du Consortium Unicode (chapitre 16.8) pour identifier l'encodage des flux de données (fichier, stream, ...).

    Pour une fois que Microsoft respecte une convention ou un standard.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Non, ce n'est pas une convention de Microsoft mais une convention du Consortium Unicode (chapitre 16.8) pour identifier l'encodage des flux de données (fichier, stream, ...).
    Les choses sont à mon sens un peu plus complexe que ça. Unicode a prévu le BOM d'abord comme espace sans chasse insécable. Ensuite, dans le cadre de protocoles qui en avait besoin, on lui a donné la fonction d'indicateur d'ordre d'octet, par après on l'a utilisé comme indicateur de code et finalement classé obsolète sa fonction d'espace sans chasse insécable pour la donner à U+2060, le gluon de mot.

    Mais la FAQ et le texte du standard me semble toujours aussi clair: le BOM
    est à employer si
    - le protocole l'impose (c'est, à ce que je comprends, le cas des fichiers textes de Windows -- mais voir plus bas)
    - le protocole l'autorise; mais dans ce cas, l'absence n'indique pas qu'il ne s'agit pas de donnée en Uncode.
    Et il faut faire attention à ne pas l'utiliser systématiquement:
    - des protocoles (je crois qu'XML en fait partie) demandent à commencer en ASCII et contiennent par la suite une indication du code utilisé, code qui est un surensemble de l'ASCII (comme l'est UTF-8). Commencer alors par un BOM est problématique.

    Pour une fois que Microsoft respecte une convention ou un standard.
    Microsoft a décidé d'utiliser un BOM dans ses fichiers textes. C'est un choix compréhensible comme l'est le choix opposé de ne pas en utiliser un. Ca ne me gène pas.

    Ce qui me gène, c'est quand les conséquences ne sont pas assumées jusqu'au bout: j'ai créé deux petits fichiers, qui commençaient bien par un BOM. Et je les ai copié avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COPY /A F1.TXT+F2.TXT SUM.TXT
    Résultat, le BOM de F2.TXT est présent au mileu de SUM.TXT, ce qui n'a pas lieu d'être quand on concatène des fichiers textes si le BOM n'est qu'un indicateur de code.

    En fait, j'en suis à me demander si il y a bien une notion claire de ce qu'est un fichier texte sous Windows (il y a ce point, il y a aussi le problème de savoir si CR LF est une marque de fin de ligne ou un séparateur de ligne; un certain nombre de messages ici et ailleurs laissent penser qu'il s'agit d'un séparateur, mais pourquoi alors un CR LF n'est pas inséré avec la commande ci-dessus?)

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Les choses sont à mon sens un peu plus complexe que ça. Unicode a prévu le BOM d'abord comme espace sans chasse insécable. Ensuite, dans le cadre de protocoles qui en avait besoin, on lui a donné la fonction d'indicateur d'ordre d'octet, par après on l'a utilisé comme indicateur de code et finalement classé obsolète sa fonction d'espace sans chasse insécable pour la donner à U+2060, le gluon de mot.
    Je pensais que les développeurs ont utilisés la séquence FE FF comme identifiant little/big endian avant que le consortium ne règlemente son utilisation. Et que c'était pour cela que, plus tard, cette séquence fut répertoriée comme "caractère vide". Mais bon, je n'ai pas confirmation de cette rumeur.

    Ce qui me gène, c'est quand les conséquences ne sont pas assumées jusqu'au bout: j'ai créé deux petits fichiers, qui commençaient bien par un BOM. Et je les ai copié avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COPY /A F1.TXT+F2.TXT SUM.TXT
    Résultat, le BOM de F2.TXT est présent au mileu de SUM.TXT, ce qui n'a pas lieu d'être quand on concatène des fichiers textes si le BOM n'est qu'un indicateur de code.
    Ca conforte mon idée de "bidouille" de développeur qui a été règlementée plus tard car le caractère correspondant au BOM est un "vide". Donc meme s'il y a un second BOM au milieu du document (a cause de la concaténation) ca ne devrait pas gêner.

    Il peut y avoir un problème si le BOM n'est pas le même, mais on peut imaginer un parser capable de s'adapter. Cependant le standard dit qu'on de doit pas changer l'encodage au milieu d'un document.



    En fait, j'en suis à me demander si il y a bien une notion claire de ce qu'est un fichier texte sous Windows (il y a ce point, il y a aussi le problème de savoir si CR LF est une marque de fin de ligne ou un séparateur de ligne; un certain nombre de messages ici et ailleurs laissent penser qu'il s'agit d'un séparateur, mais pourquoi alors un CR LF n'est pas inséré avec la commande ci-dessus?)[/QUOTE]
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. AIX - Détecter l'encodage d'un fichier texte
    Par vbonnin dans le forum AIX
    Réponses: 1
    Dernier message: 22/08/2015, 12h22
  2. Réponses: 9
    Dernier message: 12/07/2011, 17h25
  3. Réponses: 2
    Dernier message: 19/10/2009, 21h36
  4. Comment connaître l'encodage d'un fichier texte?
    Par sergentgarcia dans le forum Général Python
    Réponses: 3
    Dernier message: 26/05/2008, 10h41
  5. Gérer l'encodage d'un fichier texte
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 15/05/2007, 10h24

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