- Marque d'ordre des octets
-
Pour les articles homonymes, voir BOM.
En Unicode, une marque d'ordre des octets ou BOM (pour l'anglais Byte Order Mark) est un caractère unicode de code point U+FEFF (espace insécable de largeur nulle «zero-width no-break space»), quand ce caractère est utilisé pour marquer l'endianness (boutisme) d'une chaîne de caractères UCS/Unicode codée en UTF-16 ou UTF-32 et/ou comme marqueur pour indiquer que le texte est codé en UTF-8, UTF-16 ou UTF-32. Le terme officiel dans la version française de l'ISO/CEI 10646, qui est le pendant ISO d'Unicode, de ce caractère est indicateur d'ordre des octets (IOO).
Lorsqu'il est correctement interprété, l'IOO n'est pas vu par l'utilisateur final du texte codé. Dans le cas contraire, l'utilisateur est confronté à une courte séquence de caractères incompréhensibles.
Dans la plupart des codages le BOM est une séquence qui est peu vraisemblablement visible dans la plupart des codages conventionnels ou autres codages unicodes (cela ressemble usuellement à une obscure séquence de codes de contrôles).
Si un BOM est mal interprété comme caractères à l'intérieur du texte, alors il sera invisible en raison du fait que c'est un zero-width no-break space. L'utilisation du caractère U+FEFF comme une « espace insécable de largeur nulle » a été rendue obsolète dans la version Unicode 3.2 (qui fournit une alternative : U+2060 pour cette utilisation). Ce caractère doit donc être utilisé seulement pour la sémantique de «BOM».
Sommaire
BOM dans les différents codages unicode
En UTF-16, un BOM est exprimé avec une séquence de deux octets FE FF au début de la chaîne codée, pour indiquer que les caractères codés suivants utilisent l'ordre big-endian; ou, si la séquence est FF FE pour indiquer l'ordre little-endian. La valeur U+FFFE est garantie pour ne pas être du tout un caractère Unicode, et peut être utilisée pour détecter l'ordre des octets par contraste avec U+FEFF qui est un caractère.
Alors qu'UTF-8 n'est lié à aucune problématique d'ordre des octets, un BOM codé en UTF-8 peut être utilisé pour identifier un fichier comme UTF-8, bien que ce ne soit pas recommandé[1]. Le BOM n'apporte alors aucune information sur l'ordre des octets[2].
Bien qu'un BOM puisse être utilisé avec UTF-32, ce codage n'est cependant jamais utilisé en pratique.
Problèmes liés à l'utilisation de la marque d'ordre des octets
Beaucoup de logiciels Windows (incluant Windows Notepad) en ajoutent un aux fichiers UTF-8. Cependant, sur des systèmes de type Unix (qui utilisent beaucoup les fichiers textes pour la configuration) cette pratique n'est pas recommandée, car cela peut interférer avec le traitement adéquat de codes importants tels que le shebang au début d'un script interprété[3]. Il peut également interférer avec le source pour les langages de programmation qui ne le reconnaissent pas. Par exemple, gcc reporte des stray characters au début du fichier source, et en PHP, si l'output buffering est désactivé, cela a pour effet subtil de faire que la page commence immédiatement à être envoyée au navigateur, et d'empêcher les custom headers d'être spécifiés par le script PHP. La représentation UTF-8 du BOM est la séquence d'octets EF BB BF, qui apparaît en codage ISO-8859-1 comme "" dans les éditeurs de textes et navigateurs mal préparés pour traiter l'UTF-8. Ils peuvent également échouer à appliquer la première règle d'une feuille CSS[4] ou faire échouer l'utilisation de certaines fonctions PHP5 (simplexml_load_file() par exemple).
Représentations des marques d'ordre d'octets par codage
Codage Représentation UTF-8 EF BB BF UTF-16 Big Endian FE FF UTF-16 Little Endian FF FE UTF-32 Big Endian 00 00 FE FF UTF-32 Little Endian FF FE 00 00 SCSU 0E FE FF UTF-7 2B 2F 76
et l'une des séquences d'octets suivantes: [ 38 | 39 | 2B | 2F | 38 2D ]UTF-EBCDIC DD 73 66 73 BOCU-1 FB EE 28 La norme unicode n'impose pas toujours la marque d'ordre des octets en début de flux de données unicode, c'est le cas en particulier pour UTF-8, où le BOM est facultatif.
Voir aussi
Références
- (en) http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf. Consulté le 4 janvier 2009. « Use of a BOM is neither required nor recommended for UTF-8, but may be encountered in contexts where UTF-8 data is converted from other encoding forms that use a BOM or where the BOM is used as a UTF-8 signature », p. 36
- (en) FAQ - UTF-8, UTF-16, UTF-32 & BOM: Can a UTF-8 data stream contain the BOM character (in UTF-8 form)? If yes, then can I still assume the remaining UTF-8 bytes are in big-endian order?. Consulté le 4 janvier 2009
- (en) Markus Kuhn, « UTF-8 and Unicode FAQ for Unix/Linux: What different encodings are there? », 2007. Consulté le 20 janvier 2009. « Adding a UTF-8 signature at the start of a file would interfere with many established conventions such as the kernel looking for “#!” at the beginning of a plaintext executable to locate the appropriate interpreter. »
- (en) FAQ: Display problems caused by the UTF-8 BOM, W3C i18n
Liens externes
- Unicode en français, chapitre 14
- The Unicode Standard, chapter 13 (PDF) (see 13.6 — Specials)
- FAQ — UTF and BOM
Bibliographie
P. Andries, Unicode 5.0 en pratique, Paris, Dunod, 2008.
Wikimedia Foundation. 2010.