Intermédiaire 8 min de lecture 25 janvier 2025

Byte Order Mark (BOM) : petits octets, gros ennuis

Tout semble correct, mais votre JSON est refusé, vos entêtes PHP explosent, votre shebang ne s’exécute plus. Le coupable est souvent le Byte Order Mark. Invisible à l’écran, il modifie pourtant le flux d’octets. Voici ce qu’est le BOM, pourquoi il pose problème et comment s’en débarrasser sans casse.

Qu'est-ce que le Byte Order Mark (BOM) ?

Le BOM est une séquence d’octets placée en tête d’un fichier ou d’un flux texte pour indiquer l’endianness et parfois l’encodage. En UTF‑8, il est optionnel et souvent source d’erreurs.

Voici les variantes et signatures BOM courantes :

1 UTF‑8 avec BOM

Signature tri-octets au début des fichiers UTF‑8.

EF BB BF (0xEF 0xBB 0xBF)

2 UTF‑16 (endianness)

Indique l’ordre des octets (big-endian ou little-endian).

FE FF (BE), FF FE (LE)

3 UTF‑32 (endianness)

Moins courant sur le web mais présent dans certains exports.

00 00 FE FF (BE)
FF FE 00 00 (LE)

4 Apparentés et confusions fréquentes

U+FEFF peut exister comme caractère zéro largeur dans le texte.

U+FEFF — marque BOM et ancien ZWNBSP
U+2060 — WORD JOINER (à ne pas confondre)
Présence en tête de flux vs au milieu du contenu

Problèmes classiques

Exports d’éditeurs ou d’ETL

Ajoutent un BOM en tête de CSV/JSON/JS/PHP, ce qui casse des parsers et pipelines.

Tests unitaires qui échouent

Comparaisons ratées car une chaîne commence par U+FEFF (EF BB BF en UTF‑8).

Trim() ou strip() inefficaces

Le BOM n’est pas un espace classique et reste en tête des chaînes/fichiers.

Regex et parsers perturbés

EF BB BF en tête casse des entêtes HTTP, JSON.parse, YAML, shebang, etc.

Exemple de problème courant :

# Fichier PHP enregistré en UTF‑8 avec BOM
<?php # un BOM (EF BB BF) est sorti avant PHP
header('Content-Type: application/json');
echo json_encode(['ok' => true]);
# ❌ Warning: Cannot modify header information - headers already sent by ...

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Git montre un changement en début de fichier sans différence visible
!
Un JSON renvoie “Unexpected token  in JSON at position 0” (caractère U+FEFF)
!
PHP affiche “headers already sent” dès le début du script
!
Un script avec shebang (#!) ne s’exécute pas sous Unix
!
Le terminal affiche “” au tout début d’une ligne

Comment le détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie immédiatement la présence d’un Byte Order Mark et précise sa forme (UTF‑8, UTF‑16, UTF‑32). L’analyse se fait en temps réel et pointe l’emplacement exact du BOM pour faciliter la correction.

✅ Détection automatique

Repère EF BB BF, FE FF, FF FE, et variantes UTF‑32

📊 Analyse complète

Affiche les octets, la position et l’impact potentiel sur vos outils

🧹 Nettoyage automatique

Supprime proprement le BOM sans toucher au reste du contenu

💾 Export propre

Téléchargement en UTF‑8 sans BOM, prêt pour CI/CD

Autres méthodes de détection

Affichage dans l'éditeur

Vérifiez la barre d’état : “UTF‑8 with BOM” dans VS Code, JetBrains, Sublime
Convertissez en “UTF‑8” (sans BOM) via “Save with Encoding…”

En ligne de commande (Unix)

# Repérer un BOM UTF‑8 (EF BB BF) en tête de fichier
grep -rlU $'^\xEF\xBB\xBF' .
# Afficher les premiers octets d’un fichier
head -c 3 fichier.txt | hexdump -C
# Identifier BOM UTF‑16/UTF‑32
xxd -g 1 -l 4 fichier.txt | head -n 1
# Retirer un BOM UTF‑8 en place (backup conseillé)
sed -i '1s/^\xEF\xBB\xBF//' fichier.txt

En code

JavaScript

str = str.replace(/^\uFEFF/, '')

Python

data = open(path, encoding="utf-8-sig").read()

Excel / Google Sheets

=SI(UNICODE(GAUCHE(A1;1))=65279;STXT(A1;2;NBCAR(A1)-1);A1)

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d’écrire un script, utilisez Clean ASCII pour détecter et supprimer immédiatement le BOM dans votre texte.

Détection automatique du BOM
Nettoyage en un clic
Export UTF‑8 sans BOM

Méthodes techniques avancées

🔧 Normaliser

Sauvegardez vos fichiers en UTF‑8 sans BOM par défaut
Évitez d’émettre un BOM sur les réponses HTTP (avant tout header)
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Ajoutez une fonction strip_bom() au chargement des fichiers
Remplacez U+FEFF au début des chaînes par vide
N’autorisez le BOM que si le format l’exige explicitement

⚙️ Automatiser

Hooks pre-commit pour refuser les fichiers commençant par EF BB BF
Tests automatiques qui lisent en “utf-8-sig” ou vérifient l’absence de BOM
Linting d’encodage sur la CI pour scripts, JSON, CSV

Checklist rapide

Fichiers en UTF‑8 sans BOM par défaut
Éditeurs configurés pour ne pas écrire de BOM
Vérification du BOM dans la CI ou pre-commit
Fonction de suppression du BOM à l’import des données
Parsers configurés pour ignorer U+FEFF en tête de flux
Documentation équipe sur encodages et BOM

Conclusion

Le Byte Order Mark se cache en tout début de flux, mais ses effets se propagent partout. Un simple EF BB BF suffit à bloquer des pipelines entiers.

En adoptant une politique “UTF‑8 sans BOM”, en détectant systématiquement U+FEFF et en automatisant le nettoyage, vous évitez la majorité des bugs d’encodage et d’intégration.

Détectez le Byte Order Mark maintenant

Utilisez notre outil pour repérer et retirer le BOM en quelques secondes.

Analyser mon texte