Intermédiaire 8 min de lecture 25 janvier 2025

BOM UTF-8 : problèmes, détection et correction

Le BOM UTF-8 (EF BB BF) se glisse au début de certains fichiers et déclenche des erreurs difficiles à comprendre : JSON illisible, en-têtes PHP déjà envoyés, premières cellules CSV polluées. Voici comment reconnaître ce marqueur, pourquoi il apparaît et comment l’éliminer proprement.

Qu'est-ce que le BOM UTF-8 ?

Le Byte Order Mark (BOM) est une séquence d’octets placée au tout début d’un fichier texte. En UTF‑8, il vaut EF BB BF et n’est pas nécessaire, mais certains éditeurs l’ajoutent.

Repères essentiels à propos du BOM et de l’encodage :

1 Encodages et marqueur de début

Le BOM annonce l’ordre des octets pour UTF‑16/UTF‑32. En UTF‑8, il n’indique rien d’utile.

UTF‑8 BOM = EF BB BF • UTF‑16 BE BOM = FE FF • UTF‑16 LE BOM = FF FE

2 U+FEFF et confusions fréquentes

Historiquement U+FEFF servait aussi d’espace insécable zéro largeur. Aujourd’hui, U+FEFF est réservé au BOM.

U+FEFF = BOM • À ne pas confondre avec ZWNBSP • En UTF‑8, U+FEFF encode EF BB BF en tête

3 Quand et pourquoi il apparaît

Ajouté par certains IDE/éditeurs ou exporteurs (Excel, CMS), surtout lors d’enregistrements par défaut.

Fichiers PHP/JS/JSON avec EF BB BF au début
CSV où la première cellule contient un caractère parasite
HTML envoyé avec BOM avant les en-têtes HTTP
Scripts shell dont le shebang est précédé du BOM

4 Variantes et impacts techniques

Les BOM d’UTF‑16/UTF‑32 sont utiles, mais celui d’UTF‑8 cause surtout des effets de bord.

UTF‑16/32: BOM indique l’endianess
UTF‑8: BOM superflu, source d’erreurs d’analyse
Affichages "" en début de texte dans certains contextes

Problèmes classiques

En-têtes PHP déjà envoyés

Le BOM précède <?php et provoque "Cannot modify header information".

JSON/JS parse error

Un BOM au début d’un JSON entraîne "Unexpected token" côté navigateur ou backend.

CSV et premières colonnes décalées

EF BB BF se retrouve dans la première cellule et perturbe l’import ou les comparaisons.

Scripts et shebang invalides

Le BOM avant la ligne #!/usr/bin/env bash rend le script non exécutable correctement.

Exemple de problème courant :

# Fichier JSON avec BOM en tête (EF BB BF)
hex = "EF BB BF 7B 22 6B 65 79 22 3A 22 76 61 6C 22 7D"
json = "{"key":"val"}" # Le caractère invisible initial est le BOM
parse(json) # ❌ Erreur de parsing

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Le navigateur affiche "" au début d’une page ou d’un flux JSON
!
Un import CSV crée une première colonne fantôme ou des entêtes incorrects
!
PHP signale "Cannot modify header information" sans sortie apparente dans le code
!
Diff Git montre une modification dès le premier octet sans changement visible
!
Un script shell refuse de s’exécuter correctement malgré un shebang correct

Comment le détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie instantanément la présence d’un BOM UTF‑8 en tête de texte et signale précisément sa position et son impact potentiel sur vos traitements.

✅ Détection automatique

Reconnaissance des octets EF BB BF en tout début de contenu

📊 Analyse complète

Affichage des octets, du code U+FEFF et du contexte d’apparition

🧹 Nettoyage automatique

Suppression sûre du BOM UTF‑8 sans altérer le reste du fichier

💾 Export propre

Téléchargement immédiat en UTF‑8 sans BOM

Autres méthodes de détection

Affichage dans l'éditeur

Activez l’indicateur BOM et la vue hexadécimale dans VS Code, JetBrains, Sublime
Configurez l’enregistrement "UTF‑8 sans BOM" par défaut

En ligne de commande (Unix)

# Tester les 3 premiers octets
head -c 3 fichier | hexdump -C
# Rechercher le BOM au début
grep -aob "^\xEF\xBB\xBF" fichier
# Identifier l’encodage MIME
file -bi fichier
# Inspecter en hex
hexdump -C fichier | sed -n '1,2p'

En code

JavaScript

const hasBOM = s => s.charCodeAt(0) === 0xFEFF;
const clean = s => hasBOM(s) ? s.slice(1) : s;

Python

# Lecture qui mange le BOM automatiquement
open("fichier.txt", "r", encoding="utf-8-sig").read()

Excel / Google Sheets

SUBSTITUE(cellule;CAR(65279);"")

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant de parcourir vos fichiers à la main, utilisez Clean ASCII pour enlever EF BB BF en une étape et repartir sur un encodage UTF‑8 sans BOM.

Détection automatique
Nettoyage intelligent
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Enregistrez par défaut en UTF‑8 sans BOM dans vos éditeurs
Servez l’en-tête HTTP correct: Content-Type: text/plain; charset=UTF-8
Uniformisez les fins de ligne (gitattributes, dos2unix) pour éviter d’autres artefacts

🧹 Filtrer

Supprimez U+FEFF en tête de chaîne côté backend avant parsing
Utilisez des options d’ouverture "utf-8-sig" (Python) ou équivalents
Nettoyez les exports CSV avant ingestion (sed/awk pour retirer EF BB BF)

⚙️ Automatiser

Hooks pre-commit refusant les fichiers contenant EF BB BF
Vérifications CI pour détecter le BOM sur tous les artefacts texte
Fichier .editorconfig imposant charset utf-8 et pas de BOM

Checklist rapide

Fichiers en UTF-8 sans BOM (EF BB BF absent)
Fins de ligne uniformes via gitattributes
Éditeur configuré pour afficher et bloquer le BOM
Fonction de suppression U+FEFF au chargement des textes
Tests empêchant le BOM dans les ressources JSON/CSV/JS
Documentation interne sur l’encodage UTF‑8 sans BOM

Conclusion

Le BOM UTF‑8 est minuscule mais peut bloquer des chaînes complètes de traitement. En l’ayant à l’œil, vous évitez des erreurs coûteuses et des heures de recherche.

Détectez-le systématiquement, supprimez-le quand il n’est pas requis et standardisez vos outils sur l’UTF‑8 sans BOM.

Vérifiez la présence d’un BOM UTF‑8 maintenant

Utilisez notre outil pour détecter et supprimer le BOM au début de vos fichiers.

Analyser mon fichier