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

C# Discussion :

UTF 8 et son entête


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 978
    Par défaut UTF 8 et son entête
    Bonjour tout le monde,

    Pour savoir si un fichier texte a un entête UTF8, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		private static Boolean IsUtf8(string path)
    		{
    			byte[] O = new byte[4];
                using (FileStream SourceStream = File.Open(path, FileMode.Open))
    			{
    				SourceStream.Seek(0, SeekOrigin.Begin);
    				SourceStream.Read(O, 0, 4);
    			}
    			byte[] tref = new byte[] {
    				(byte)0xEF, (byte)0xBB, (byte)0xBF, (byte)0x5B };
    			return O.SequenceEqual(tref);
    		}
    Je teste donc la présence des caractères "[" et ça marche, or dans le fichier je n'ai que les trois premiers caractères, après c'est le contenu, et il commence par un g.

    J'ai bien vu il n'y a pas longtemps une doc avec 3 caractères dans l'entête UTF 8, mais dans ma fonction c'est bien 4 caractères, pas vrai ?

    Quelqu'un saurait-il me dire comment ça se fait que ça marche, alors que j'ai l'impression que ça ne devrait pas ?

    Par ailleurs, quand il n'y a pas d'entête, le programme est supposé "deviner" l'encodage d'après le contenu texte du fichier. Mais ... On fait ça comment ?

  2. #2
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Ici https://unicode.org/faq/utf_bom.html une page explicative des bytes analysés par ton code et à priori le BOM utf8 est de 3 bytes, pas 4.

    EF BB BF
    Ton code semble donc faux, pourquoi ça marche ou pas ? Sans les fichiers de tests que tu utilises pour en tirer tes conclusions, difficile de dire (ou alors tous les fichiers qui passent commencent par un '[' ).

    Pour ce qui est de deviner l'encodage, je ne connais pas de solution.

  3. #3
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 978
    Par défaut
    Citation Envoyé par DelphiManiac Voir le message
    Ici https://unicode.org/faq/utf_bom.html une page explicative des bytes analysés par ton code et à priori le BOM utf8 est de 3 bytes, pas 4.
    Précieux, merci.


    Ton code semble donc faux, pourquoi ça marche ou pas ?
    OK. Je ne saurais plus dire d'où j'ai pompé ça, ça doit bien faire un an que je m'en sers. Il n'y a pas eu d'évolution, entre temps ?

    Là, j'ai eu un fichier mal encodé, et il s'est avéré que c'était parce qu'il n'avait pas d'entête d'encodage. Je ne me suis pas embêté, Notepad2 m'a fait ça en moins de deux.

    Après la manœuvre, dans la barre d'état, "UTF8" est devenu "UTF8 Signature", et le fichier démarre comme ça :
    Nom : DébutFichier.png
Affichages : 174
Taille : 27,0 Ko

    Sans les fichiers de tests que tu utilises pour en tirer tes conclusions, difficile de dire (ou alors tous les fichiers qui passent commencent par un '[' ).
    Ça promet de ne pas être immédiat, c't'affaire.


    Pour ce qui est de deviner l'encodage, je ne connais pas de solution.
    Bon, je continuerai à m'en sortir comme j'ai fait aujourd'hui, alors.
    Quelqu'un quelque part (cité dans le fil, directement ou indirectement) a dit de ne pas mettre des entêtes systématiquement, il va peut-être falloir que je creuse un peu ça.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 586
    Par défaut
    En fait, ton code utilisant SequenceEqual pour vérifier l'encodage, ça permet d'être OK quand c'est un encodage UTF8 avec BOM (un octet supplémentaire en tête); le SequenceEqual vérifie si il y a la séquence des octets dans les octets lus

    Tu peux aussi utiliser Stream.CurrentEncoding après une 1ère lecture pour déterminer l'encodage https://learn.microsoft.com/en-us/do...g?view=net-7.0
    Pour savoir si il y a le BOM, tu peux utiliser GetPreamble() et vérifier son contenu (vide si pas de BOM)

Discussions similaires

  1. Copier une colonne de tableau selon son entête
    Par golgoth51 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/07/2021, 08h49
  2. Réponses: 1
    Dernier message: 02/06/2016, 17h33
  3. [XL-2013] Retrouver le numéro d'une colonne d'après son entête
    Par Damien37 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/11/2015, 15h23
  4. [XL-2007] Macro qui copie une colonne selon son entête vers une autre colonne ayant la même
    Par TonyBennett dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/09/2014, 21h04
  5. Réponses: 6
    Dernier message: 31/10/2009, 16h42

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