Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

insertion de BOM en UTF-8

12 réponses
Avatar
Sébastien Kirche
Bonjour,

Il existe des BOM (Byte Order Mark) permettant de détecter la nature
Unicode de fichiers encodés en UTF-8 et UTF-16. Par ailleurs il est
admis que le BOM n'est pas indispensable pour UTF-8. Dans quelques
éditeurs de texte que je pratique dans l'environnement Windows l'ajout
ou non du BOM UTF-8 est paramétrable.

Mon problème du moment est de pouvoir éditer des fichiers exploités
ensuite par un programme nécessitant la présence d'un BOM UTF-8 pour
qu'il puisse détecter que le fichier est en Unicode et non en ANSI.

Emacs de son côté semble ignorer le BOM au début d'un fichier UTF-8 et
l'affiche comme un caractère "normal" (il indique bien pour ce caractère
buffer code: #xEF #xBB #xBF) tout en prenant en compte la nature
Unicode. Et à l'enregistrement, il n'y a pas de coding-system permettant
l'ajout du BOM quand il n'y figure pas (alors qu'il y a un choix en
utf-16 avec les coding-system with-signature).

Savez-vous si on a la possibilité de forcer l'insertion de ce BOM en
UTF-8 ? Sur cette manip je suis avec Emacs 23 (EmacsW32).

Merci.
--
Sébastien Kirche

10 réponses

1 2
Avatar
Paul Gaborit
À (at) Wed, 04 Jun 2008 10:49:53 +0200,
Sébastien Kirche écrivait (wrote):
Il existe des BOM (Byte Order Mark) permettant de détecter la nature
Unicode de fichiers encodés en UTF-8 et UTF-16. Par ailleurs il est
admis que le BOM n'est pas indispensable pour UTF-8. Dans quelques
éditeurs de texte que je pratique dans l'environnement Windows l'ajout
ou non du BOM UTF-8 est paramétrable.



Le BOM en UTF-8 est un non-sens ! UTF-8 ne dépend pas de l'ordre
interne des octets du processeur.

Mon problème du moment est de pouvoir éditer des fichiers exploités
ensuite par un programme nécessitant la présence d'un BOM UTF-8 pour
qu'il puisse détecter que le fichier est en Unicode et non en ANSI.



Le BOM ne devrait pas avoir pour rôle d'indiquer que le fichier est
encodé en Unicode ou non (ce qui n'a d'ailleurs pas de sens non plus
puisque Unicode n'est pas un système de codage). Il ne devrait servir
qu'à indiquer l'ordre des octets en UTF-16 et en UTF-32.

De toutes manières, faire reposer la reconnaissance de l'encodage
UTF-8 sur la présence d'un BOM n'est pas une technique sûre : certains
encodages non UTF-* utilisent *tous* les octets.

Emacs de son côté semble ignorer le BOM au début d'un fichier UTF-8 et
l'affiche comme un caractère "normal" (il indique bien pour ce caractère
buffer code: #xEF #xBB #xBF) tout en prenant en compte la nature
Unicode.
Et à l'enregistrement, il n'y a pas de coding-system permettant
l'ajout du BOM quand il n'y figure pas (alors qu'il y a un choix en
utf-16 avec les coding-system with-signature).



Heureusement que emacs procède comme ça. C'est la bonne manière de
faire.


Savez-vous si on a la possibilité de forcer l'insertion de ce BOM en
UTF-8 ? Sur cette manip je suis avec Emacs 23 (EmacsW32).



On peut peut-être coder un truc pour automatiser cela mais je ne le
ferai pas : c'est contraire à mon éthique. ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Avatar
Sébastien Kirche
Le 4 juin 2008 à 11:44, Paul Gaborit vraute :

Le BOM en UTF-8 est un non-sens ! UTF-8 ne dépend pas de l'ordre
interne des octets du processeur.



Cependant il existe dans la norme et peut donc être utilisé. Même si
cela n'a rien à voir avec la signification de BOM, cela permet
d'identifier un fichier UTF-8 aux applications qui n'essaient pas de le
découvrir par ailleurs.

> Mon problème du moment est de pouvoir éditer des fichiers exploités
> ensuite par un programme nécessitant la présence d'un BOM UTF-8 pour
> qu'il puisse détecter que le fichier est en Unicode et non en ANSI.

Le BOM ne devrait pas avoir pour rôle d'indiquer que le fichier est
encodé en Unicode ou non (ce qui n'a d'ailleurs pas de sens non plus
puisque Unicode n'est pas un système de codage). Il ne devrait servir
qu'à indiquer l'ordre des octets en UTF-16 et en UTF-32.

De toutes manières, faire reposer la reconnaissance de l'encodage
UTF-8 sur la présence d'un BOM n'est pas une technique sûre : certains
encodages non UTF-* utilisent *tous* les octets.



Certes, mais là je n'essaie pas de faire suivant les règles de l'art
mais j'essaie de me rendre compatible avec un truc qui est ce qu'il est
et sur lequel je ne peux pas intervenir (il s'agit des fonctions d'E/S
internes fichier du compilateur PowerBuilder avec lequel je maintiens
plusieurs applications. La doc est claire : PB sait faire avec des
fichiers encodés en ANSI ou UTF mais la détection des formats UTF repose
sur la présence de BOM en UTF-8 et dans les 2 UTF-16).

> Emacs de son côté semble ignorer le BOM au début d'un fichier UTF-8
> et l'affiche comme un caractère "normal" (il indique bien pour ce
> caractère buffer code: #xEF #xBB #xBF) tout en prenant en compte la
> nature Unicode. Et à l'enregistrement, il n'y a pas de coding-system
> permettant l'ajout du BOM quand il n'y figure pas (alors qu'il y a
> un choix en utf-16 avec les coding-system with-signature).

Heureusement que emacs procède comme ça. C'est la bonne manière de
faire.



Sans doute. Mais la puissance d'Emacs est dans son adaptabilité aux
besoins de l'utilisateur, le tout étant de savoir comment le formuler à
Emacs. Même quand il s'agit de ne pas suivre les usages.

> Savez-vous si on a la possibilité de forcer l'insertion de ce BOM en
> UTF-8 ? Sur cette manip je suis avec Emacs 23 (EmacsW32).

On peut peut-être coder un truc pour automatiser cela mais je ne le
ferai pas : c'est contraire à mon éthique. ;-)



Il faut que je regarde si je peux forcer l'usage d'UTF-8 en ouverture du
fichier par mon applicatif sans avoir de BOM, mais ça ne m'enchante pas
d'écrire des paramètres "en dur". Ni d'utiliser un éditeur tiers juste
pour pouvoir enregistrer un fichier UTF-8 avec BOM.
--
Sébastien Kirche
Avatar
Paul Gaborit
À (at) Wed, 04 Jun 2008 14:27:58 +0200,
Sébastien Kirche écrivait (wrote):
Le 4 juin 2008 à 11:44, Paul Gaborit vraute :
De toutes manières, faire reposer la reconnaissance de l'encodage
UTF-8 sur la présence d'un BOM n'est pas une technique sûre : certains
encodages non UTF-* utilisent *tous* les octets.



Certes, mais là je n'essaie pas de faire suivant les règles de l'art
mais j'essaie de me rendre compatible avec un truc qui est ce qu'il est
et sur lequel je ne peux pas intervenir (il s'agit des fonctions d'E/S
internes fichier du compilateur PowerBuilder avec lequel je maintiens
plusieurs applications. La doc est claire : PB sait faire avec des
fichiers encodés en ANSI ou UTF mais la détection des formats UTF repose
sur la présence de BOM en UTF-8 et dans les 2 UTF-16).



J'indiquais juste ce qui devrait être !

On peut peut-être coder un truc pour automatiser cela mais je ne le
ferai pas : c'est contraire à mon éthique. ;-)



Il faut que je regarde si je peux forcer l'usage d'UTF-8 en ouverture du
fichier par mon applicatif sans avoir de BOM, mais ça ne m'enchante pas
d'écrire des paramètres "en dur". Ni d'utiliser un éditeur tiers juste
pour pouvoir enregistrer un fichier UTF-8 avec BOM.



Il n'est pas très difficile d'écrire une petite fonction lisp qui
teste la présence du BOM en début de buffer et l'ajoute s'il n'y est
pas juste avant d'enregistrer le buffer.

On peut aussi le faire à la main en insérant ce qu'il faut via C-q
suivi des bonnes valeurs (en octal).


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Avatar
Sébastien Kirche
Le 4 juin 2008 à 15:02, Paul Gaborit s'est exprimé ainsi :

On peut aussi le faire à la main en insérant ce qu'il faut via C-q
suivi des bonnes valeurs (en octal).



Je ne pensais plus à cette possibilité.
J'ai testé et c'est une solution qui pourra suffire je ne dois
heureusement pas refaire mes fichiers tous les jours.

Comme je ne pratique pas l'octal dans le texte j'en profite pour
indiquer un réglage de ma config pour ceux qui préfèreraient la base
décimale pour C-q :

;; choix de la base décimale pour la saisie de caractères quotés (C-q n°)
(setq read-quoted-char-radix 10)

--
Sébastien Kirche
Avatar
Paul Gaborit
À (at) Wed, 04 Jun 2008 16:25:47 +0200,
Sébastien Kirche écrivait (wrote):
Le 4 juin 2008 à 15:02, Paul Gaborit s'est exprimé ainsi :

On peut aussi le faire à la main en insérant ce qu'il faut via C-q
suivi des bonnes valeurs (en octal).



Je ne pensais plus à cette possibilité.
J'ai testé et c'est une solution qui pourra suffire je ne dois
heureusement pas refaire mes fichiers tous les jours.



Ensuite, vous utilisez C-( et C-) pour apprendre à emacs la macro qui
fait tout d'un coup. Puis vous produisez automatiquement le code lisp
(souvent pas beau mais fonctionnel) à attacher à un raccourci clavier
dans votre .emacs...

Comme je ne pratique pas l'octal dans le texte j'en profite pour
indiquer un réglage de ma config pour ceux qui préfèreraient la base
décimale pour C-q :

;; choix de la base décimale pour la saisie de caractères quotés (C-q n°)
(setq read-quoted-char-radix 10)



Dans le cas qui nous intéresse, j'aurais eu tendance à choisir la base
16. Ça me paraît le plus simple pour sairir les FF, EF, FE, BF, 00 et
autres BB des BOMs. ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Avatar
Sébastien Kirche
Le 4 juin 2008 à 18:36, Paul Gaborit s'est exprimé ainsi :

> > On peut aussi le faire à la main en insérant ce qu'il faut via C-q
> > suivi des bonnes valeurs (en octal).
>
> Je ne pensais plus à cette possibilité.
> J'ai testé et c'est une solution qui pourra suffire je ne dois
> heureusement pas refaire mes fichiers tous les jours.

Ensuite, vous utilisez C-( et C-) pour apprendre à emacs la macro qui
fait tout d'un coup. Puis vous produisez automatiquement le code lisp
(souvent pas beau mais fonctionnel) à attacher à un raccourci clavier
dans votre .emacs...



Je dois avouer que je ne sais pas me servir des macros dans emacs. Ça
fera un bon exercice pour essayer.

> Comme je ne pratique pas l'octal dans le texte j'en profite pour
> indiquer un réglage de ma config pour ceux qui préfèreraient la base
> décimale pour C-q :
>
> ;; choix de la base décimale pour la saisie de caractères quotés
> ;; (C-q n°)
> (setq read-quoted-char-radix 10)

Dans le cas qui nous intéresse, j'aurais eu tendance à choisir la base
16. Ça me paraît le plus simple pour sairir les FF, EF, FE, BF, 00 et
autres BB des BOMs. ;-)



En fait quand je visualise les infos du "BOM" UTF-8 avec C-u C-x = emacs
ne m'indique qu'un seul code de caractère pour octets dans le buffer :
character: [] (65279, #o177377, #xfeff)
preferred charset: gb18030 (GB18030)
code point: 0x84319533
syntax: w which means: word
buffer code: #xEF #xBB #xBF
file code: not encodable by coding system iso-latin-1-unix
display: no font available

Donc un coup de C-q 6 5 2 7 9 RET et mon BOM est inséré. On pouvait
insérer séparément EF BB BF qui sont intégrés en un seul caractère
ensuite ? J'ai du mal à suivre ce matin...

--
Sébastien Kirche
Avatar
Paul Gaborit
À (at) Thu, 05 Jun 2008 12:07:36 +0200,
Sébastien Kirche écrivait (wrote):
Le 4 juin 2008 à 18:36, Paul Gaborit s'est exprimé ainsi :
Dans le cas qui nous intéresse, j'aurais eu tendance à choisir la base
16. Ça me paraît le plus simple pour sairir les FF, EF, FE, BF, 00 et
autres BB des BOMs. ;-)



En fait quand je visualise les infos du "BOM" UTF-8 avec C-u C-x = emacs
ne m'indique qu'un seul code de caractère pour octets dans le buffer :
character: [] (65279, #o177377, #xfeff)
preferred charset: gb18030 (GB18030)
code point: 0x84319533
syntax: w which means: word
buffer code: #xEF #xBB #xBF
file code: not encodable by coding system iso-latin-1-unix
display: no font available

Donc un coup de C-q 6 5 2 7 9 RET et mon BOM est inséré. On pouvait
insérer séparément EF BB BF qui sont intégrés en un seul caractère
ensuite ? J'ai du mal à suivre ce matin...



On peut partir d'un buffer que emacs considère comme encodé dans le
codage local (du genre iso-8859-1). Dans ce cas, il faut insérer les
trois octets EF, BB, BF pour insérer le BOM utf-8 (c'est là que la
base 16 me semble plus pratique...). Ensuite à la relecture du
fichier, emacs choisit tout seul le codage utf-8 (même si le BOM
apparaît comme un petit carré en début de fichier).

Lorsqu'on bascule en UTF-16(LE/BE) ou en UTF-32(LE/BE), emacs insère
tout seul le BOM correspondant. Il ne le fait pas en UTF-8. Et mes
tentatives d'insértion du caractère FEFF (le BOM) si emacs est déjà en
UTF-8 n'insère pas la bonne séquence d'octets... Mais j'ai testé ça
très rapidement.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Avatar
Sébastien Kirche
Le 5 juin 2008 à 16:18, Paul Gaborit vraute :

> Donc un coup de C-q 6 5 2 7 9 RET et mon BOM est inséré. On pouvait
> insérer séparément EF BB BF qui sont intégrés en un seul caractère
> ensuite ? J'ai du mal à suivre ce matin...

On peut partir d'un buffer que emacs considère comme encodé dans le
codage local (du genre iso-8859-1). Dans ce cas, il faut insérer les
trois octets EF, BB, BF pour insérer le BOM utf-8 (c'est là que la
base 16 me semble plus pratique...). Ensuite à la relecture du
fichier, emacs choisit tout seul le codage utf-8 (même si le BOM
apparaît comme un petit carré en début de fichier).



Ah ok. Je n'avais pas fait tout de suite le lien avec le codage actuel
du fichier qui peut effectivement être avec 1 octet par caractère comme
mon encodage par défaut.

--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 5 juin 2008 à 16:18, Paul Gaborit vraute :

On peut partir d'un buffer que emacs considère comme encodé dans le
codage local (du genre iso-8859-1). Dans ce cas, il faut insérer les
trois octets EF, BB, BF pour insérer le BOM utf-8 (c'est là que la
base 16 me semble plus pratique...). Ensuite à la relecture du
fichier, emacs choisit tout seul le codage utf-8 (même si le BOM
apparaît comme un petit carré en début de fichier).

Lorsqu'on bascule en UTF-16(LE/BE) ou en UTF-32(LE/BE), emacs insère
tout seul le BOM correspondant. Il ne le fait pas en UTF-8. Et mes
tentatives d'insértion du caractère FEFF (le BOM) si emacs est déjà en
UTF-8 n'insère pas la bonne séquence d'octets... Mais j'ai testé ça
très rapidement.



--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 5 juin 2008 à 16:18, Paul Gaborit vraute :

On peut partir d'un buffer que emacs considère comme encodé dans le
codage local (du genre iso-8859-1). Dans ce cas, il faut insérer les
trois octets EF, BB, BF pour insérer le BOM utf-8 (c'est là que la
base 16 me semble plus pratique...). Ensuite à la relecture du
fichier, emacs choisit tout seul le codage utf-8 (même si le BOM
apparaît comme un petit carré en début de fichier).

Lorsqu'on bascule en UTF-16(LE/BE) ou en UTF-32(LE/BE), emacs insère
tout seul le BOM correspondant. Il ne le fait pas en UTF-8. Et mes
tentatives d'insértion du caractère FEFF (le BOM) si emacs est déjà en
UTF-8 n'insère pas la bonne séquence d'octets... Mais j'ai testé ça
très rapidement.



J'ai mis à jour mon EMacsW32 et j'ai la surprise de voir les coding
system suivants :

utf-8 utf-8-auto
utf-8-auto-dos utf-8-auto-mac
utf-8-auto-unix utf-8-dos
utf-8-emacs utf-8-emacs-dos
utf-8-emacs-mac utf-8-emacs-unix
utf-8-mac utf-8-unix
utf-8-with-signature utf-8-with-signature-dos
utf-8-with-signature-mac utf-8-with-signature-unix



sur l'emacs-snapshot (PPC) qui me sert à rédiger ce message, je n'ai ni
les version -auto, ni -with-signature, et ils n'étaient pas dans la
version précédente d'EmacsW32 lorsque je me suis posé ces problèmes
existentiels de BOM... Je viens de regarder les logs du cvs : ça a été
ajouté les 29 et 30 mai dernier.

On dirait que toutes les fonctionnalités concernant unicode ne sont pas
encore terminées. Il faudrait que je me réabonne à la liste emacs-devel
pour suivre.

En tout cas, je trouve ça plus conforme à mon usage "couteau suisse des
éditeurs" d'Emacs : permettre de faire même quand ce n'est pas l'état de
l'art.
--
Sébastien Kirche
1 2