Aller au contenu

UTF8 Codage qui a du caractère


Fraid

Messages recommandés

Bonjour,

 

Encore une question sur l'UTF8 ...

Je sait bien que ce n'est pas passionnant,

Mais si il y a bien une chose qui exaspère les programmeurs, c'est bien l'encodage de caractères.

Et notamment celui là.

 

(gile) est venu à notre secours grâce à ces fonctions de lecture et écriture en UTF8 (avec BOM).

gc:WriteStream et gc:ReadStream

Mais si on ne sait pas d'avance l'encodage d'un fichier, on fait comment?

J'ai essayé en écrivant cette fonction toute simple en recherchant le BOM et/ou un caractére spécial lu en ANSI

 

;;;isUTF8
;;;Détermine si un fichier est encodé en UTF8
;;;Argument : nom du fichier ou chemin complet
;;;Retour T si UTF8 sinon nil (pour ANSI ou UTF8 sans BOM ni caractère spécial.)
(defun isUTF8 (file / rid line ret)
   (and (setq file (findfile file))
        (setq rid (open file "r"))
        (or (if (wcmatch (setq line (read-line rid)) "*,*Ã*")(setq ret T));BOM ou caractère spécial
            (while (and (setq line (read-line rid))(null ret))
               (if (wcmatch line "*Ã*")(setq ret T))
            )
        )
   )
   (if rid (close rid))
 ret
)

 

Mais si le fichier ne contient pas de caractère spécial, ni de BOM (caractère invisible placé au début)

il me semble impossible de discerner l'ANSI de L'UTF8.

 

Si quelqu'un à une solution ...Merci

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

En continuant mes recherches, j'ai trouvé une solution pour enlever le BOM

qui peut créer des bugs.

 

;;;utf8noBOM
;;;Supprime le BOM d'un fichier encodé en UTF8 avec BOM
;;;Arg: String Nom du fichier ou chemin complet
;;;Retour: T ou nil
;;;Doc https://stackoverflow.com/questions/31435662/vba-save-a-file-with-utf-8-without-bom
;;;    https://www.w3schools.com/asp/ado_ref_stream.asp
(defun utf8noBOM (file / rid wri)
   (and (setq file (findfile file))
        (not (vl-catch-all-error-p (vl-catch-all-apply ;Test d'erreur
             (function 
               (lambda () ;Fonction anonyme permetant le test d'erreur
                   (setq rid (vlax-create-object "ADODB.Stream");Création des flux d'octects (Stream)
                         wri (vlax-create-object "ADODB.Stream")
                   )
                   (vlax-put rid 'Charset  "utf-8");Lecture du fichier
                   (vlax-invoke rid 'Open)
                   (vlax-invoke rid 'LoadFromFile file)
                   (vlax-put rid 'Position  3);On positionne la lecture sur le 4ém caractère
                   (vlax-put wri 'Type  1);Données Binaires
                   (vlax-invoke wri 'Open)
                   (vlax-invoke rid 'CopyTo wri);Copie du flux vers l'autre
                   (vlax-invoke rid 'Close)
                   (vlax-invoke wri 'SaveToFile file 2)
                   (vlax-invoke wri 'Close)
                   (vlax-release-object rid)
                   (vlax-release-object wri)
               );lambda
             );function
             ));catch
        );not
   );and
)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Fraid,

 

J'ai été confronté, il n'y a pas longtemps au même problème.

 

J'ai créé une petite application qui vérifie si un fichier txt ou scr est encodé en UTF8 et si c'est le cas l'appli créer une copie de ce fichier et le converti en AINSI.

 

Le problème, c'est que si le fichier ne contient aucun caractère spécial, le fichier semble être en standard reconnu comme un fichier encodé en UTF 8.

 

On peut faire un exemple tout simple. On ouvre le bloc note de Windows ou un éditeur de texte de type Notepad++, on écrit, au hasard, "eric" sans accent, on enregistre le fichier en choisissant l'encodage AINSI. On ferme le fichier. On ouvre le fichier, l'encodage affiché est UTF 8.

 

On fait un autre exemple, on écrit cette fois, toujours au hasard, "éric" avec accent, on enregistre le fichier en choisissant l'encodage AINSI. On ferme le fichier. On ouvre le fichier, l'encodage affiché est AINSI.

Donc, s'il n'y a pas un caractère spécifique, ça semble compliqué de savoir si c'est de l'ANSI, du moins c'est ce que j'en ai déduit.

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité