Centre d‘Information

Byte Order Mark (BOM)

La Unicode Byte Order Mark ou la marque d’ordre d’octet Unicode est un caractère Unicode, qui affiche la endianness d’un fichier ou d’un flux (stream) Unicode. Ce caractère a la position Unicode U+FEFF et peut également être utilisé pour déterminer le codage d’un fichier texte. Le caractère vient toujours en premier dans le fichier et n’est pas interprété comme une partie du texte par le logiciel qui prend en charge le format correspondant. Un avantage de cette technique est qu’aucune information supplémentaire ne doit être fournie et que la clé d’interprétation se trouve directement dans le fichier.

Byte Order Mark de différents Codages

En fonction du codage, une séquence d'octets différente résulte du caractère U-FEFF. Les séquences d'octets pour les encodages les plus populaires sont résumées dans ce tableau:

CodageByte Order MarkASCII
ANSIPas de BOM-
UTF-72B 2F 76 ( 38 | 39 | 2B | 2F )+/v 89+/
UTF-8EF BB BF
UTF-16 Big EndianFE FFþÿ
UTF-16 Little EndianFF FEÿþ
UTF-32 Big Endian00 00 FE FF??þÿ
UTF-32 Little EndianFF FE 00 00ÿþ??

La dernière colonne (ASCII) montre à quoi ressemblerait la séquence d'octets de la marque d'ordre d'octet si elle était interprétée comme des caractères ASCII dans un éditeur de texte.

Pour lire un fichier au format UTF-16 ou UTF-32, une marque d’ordre des octets est indispensable car un caractère dans ces codages occupe plusieurs octets et la marque d’ordre des octets indique l’ordre dans lequel les octets doivent être interprétés (voir Big Endian et Little Endian concernant l’ordre des octets). D’autre part, dans UTF-8 et UTF-7, la marque d’ordre des octets n’est pas obligatoire, mais conduit néanmoins à de meilleurs résultats, car les programmes pourraient interpréter également de tels textes comme ANSI.

Vous pouvez facilement voir que la marque d’ordre des octets indique l’ordre des octets en comparant les séquences d’octets entre Big Endian (le bit le plus significatif au début) et Little Endian (le bit le moins significatif au début), car ces deux codes ils ont un ordre d’octet opposé. En UTF-16 Little Endian, la séquence d’octets est FF FE et en UTF-16 Big Endian est l’inverse (FE FF). Comme général dans UTF-32, quatre octets sont utilisés par caractère. Cela est également évident si vous regardez la marque d’ordre des octets: 00 00 FE FF pour UTF-32 Big Endian et FF FE 00 00 pour UTF-32 Little Endian.

Interprétation de la Byte Order Ma

Des problèmes et de fausses interprétations concernant la marque d’ordre des octets surviennent si les programmes ne peuvent pas interpréter la marque d’ordre des octets et affichent plutôt des caractères ANSI. Par exemple,  peut être affiché pour la marque d’ordre d’octet de UTF-8 (EF BB BF). Voici un petit problème, car les fichiers ANSI permettent également la séquence d’octets EF BB BF. Ainsi, si vous stockez la chaîne  au début d’un fichier et enregistrez ce fichier au format ANSI, la plupart des logiciels interpréteront le reste du fichier comme codé en UTF-8. Avec des applications telles que TextConverter ou TextEncoder, vous pouvez lire et écrire des fichiers avec ou sans marque d’ordre d’octet et vous pouvez modifier le format Unicode des fichiers ou indiquer si une marque d’ordre d’octet est utilisée ou non.

Si le caractère U+FEFF apparaît à une autre position qu’au début d’un fichier, il est affiché sous forme de signe avec une largeur de 0 et aucune rupture. Cependant, l’utilisation délibérée de cette marque est obsolète à cette fin. U+FEFF doit être utilisé uniquement en tant que repère d’ordre d’octet et vous devez utiliser la position du code U+2060 pour un caractère sans largeur ni interruption.

Modifier, Supprimer ou Ajouter Byte Order Mark

Avec le programme TextEncoder, vous pouvez modifier, supprimer ou ajouter la marque d’ordre des octets des fichiers. Après avoir démarré le TextEncoder, vous pouvez effectuer les opérations suivantes:

La liste de fichiers dans le TextEncoder contient une colonne nommée "BOM". Ici, vous pouvez voir si vos fichiers ajoutés ont actuellement une marque d’ordre d’octet ou non.