07 octobre 2020
publié par 

Dans le cadre d'échange de données via un fichier entre différents systèmes, un prestataire peut demander un fichier formaté avec un BOM ("byte order mark" ou indicateur d'ordre des octets) UTF-8.


Le "BOM" correspond à une suite de caractères à placer immédiatement au début du fichier. Attention, lorsqu'un BOM UTF-8 est demandé, le fichier créé doit être en ANSI. UTF-8 ne signifie pas UNICODE c'est une confusion courante.


Comme toujours dès qu'il s'agit de manipulation de chaînes et d'échange de données, deux cas se présentent en fonction du choix de gestion des chaînes en exécution dans la configuration du projet :

 

 

Cas 1, configuration de projet avec "utiliser des chaines ANSI en exécution" :

 

Le "BOM" peut être une constante du projet :

CONSTANTE
BOM_UTF = "" //EF BB BF
FIN

Ou un buffer déclaré globalement ou localement au traitement :

BOM_UTF est un Buffer = Caract(0xEF)+Caract(0xBB)+Caract(0xBF)

J'ai une préférence pour la variable, car dans le cas d'une constante, si par la suite la configuration venait à passer de ANSI à UNICODE, la constante n'aurait plus le bon contenu.

 

Si le fichier est créé par les fonctions fCrée ou fOuvre et son option foCréation, le fichier sera créé avec le code suivant :

 

sMesDonnées est une chaîne ANSI = "Mes données"
soit sNomFichier = fRepDonnées()+[fSep]+"fOuvre-Avec-BOM-UTF-8.txt"
soit hFic = fOuvre(sNomFichier, foCréation)
fEcrit(hFic, BOM_UTF)
fEcritLigne(hFic, ChaîneVersUTF8(sMesDonnées))
fFerme(hFic)

 


Si le fichier est créé par un fSauveTexte, le BOM pourra être ajouté avec le code suivant :

fSauveTexte(sNomFichier, BOM_UTF+ChaîneVersUTF8(sMesDonnées))

pour un fichier existant, on peut insérer un BOM avec la fonction fInsèreTexteAuDébut :

fInsèreTexteAuDébut(sNomFichier, BOM_UTF)

 

 

Cas 2, configuration de projet avec "utiliser des chaines UNICODE en exécution" :

 

Le BOM ne peut pas être une constante du projet déclarée en chaîne, il faut un buffer. D'autre part il faut préciser à la création du fichier l'utilisation de l'ANSI. En effet la configuration du projet étant en UNICODE, le fichier serait créé par défaut en UNICODE :

 

sMesDonnées est une chaîne ANSI = "Mes données"
BOM_UTF est un Buffer = Caract(0xEF)+Caract(0xBB)+Caract(0xBF)
soit sNomFichier = fRepDonnées()+[fSep]+"fOuvre-Avec-BOM-UTF-8.txt"
soit hFic = fOuvre(sNomFichier, foCréation+foAnsi)
fEcrit(hFic, BOM_UTF)
fEcritLigne(hFic, ChaîneVersUTF8(sMesDonnées))
fFerme(hFic)

 

 

On peut utiliser le pavé numérique pour saisir des caractères spéciaux avec la séquence ALT+0<code ascii>. La représentation hexadécimale reste cependant plus lisible et moins source d'erreur :

  • EF = ALT+0239 = 'ï' = 0xEF
  • BB = ALT+187 = "»" = 0xBB
  • BF = ALT+191 = "¿" = 0xBF

< Retour

Publier un commentaire : 
Votre adresse email ne sera pas publiée