Intermédiaire 8 min de lecture 25 janvier 2025

UTF-8 sans BOM : erreurs fréquentes, détection et bonnes pratiques

Vous sauvegardez un fichier, tout semble correct… puis un headers already sent apparaît, votre première colonne CSV devient "id", ou un JSON refuse de se parser. Le point commun ? Un BOM caché. Adoptez UTF-8 sans BOM pour éviter ces frictions et gardez vos flux texte fiables.

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

C'est un fichier encodé en UTF-8 qui ne commence pas par l'octet de signature BOM (EF BB BF). Cette absence évite l'injection d'un caractère invisible au tout début des contenus.

Points essentiels à connaître pour travailler en UTF-8 sans BOM :

1 UTF‑8 avec BOM vs sans BOM

Le BOM ajoute 3 octets au début du fichier. Sans BOM, aucun octet de signature.

UTF-8 BOM: EF BB BF • UTF-8 sans BOM: —

2 Signatures d'encodage courantes

Certains encodages utilisent une marque en tête de fichier.

UTF-8 BOM (EF BB BF), UTF-16LE (FF FE), UTF-16BE (FE FF)

3 Fins de ligne et interopérabilité

Les EOL influent autant que le BOM sur la compatibilité entre systèmes.

CRLF (0D 0A) - Windows
LF (0A) - Unix/macOS
CR (0D) - Ancien Mac

4 Cas techniques liés au BOM

Quand le BOM perturbe votre outillage ou votre code :

PHP: "Headers already sent" à cause d'un BOM avant <?php
CSV: première colonne "id" (EF BB BF interprété en Latin-1)
JSON: caractère U+FEFF en tête rendant le flux invalide

Problèmes classiques

Sauvegarde "UTF-8 with BOM" par défaut

Certains éditeurs ajoutent le BOM et polluent l'ouverture de CSV/JSON.

PHP: "Cannot modify header information"

Le BOM ajoute des octets avant tout output et casse l'envoi d'en-têtes.

CSV: entête "id" ou colonne décalée

Le BOM en tête de fichier devient des glyphes erronés dans certains outils.

JSON/API: caractère avant { ou erreurs de parsing

Un U+FEFF en préfixe rend la réponse non conforme chez certains clients.

Exemple de problème courant :

# BOM en tête d'un JSON
string1 = "{\"id\":1}"
string2 = "\uFEFF{\"id\":1}" # Contient U+FEFF (EF BB BF) au début
assert parse_json(string1) # ✅ OK
assert parse_json(string2) # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre une modification sur tout le fichier après une simple sauvegarde
!
Votre première entête CSV apparaît en "id" dans Excel ou un ETL
!
PHP affiche "headers already sent" alors qu'aucun echo n'a été fait
!
Un client JSON ou fetch() échoue à parser une réponse 200
!
Votre éditeur indique "UTF-8 with BOM" au lieu de "UTF-8"

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie immédiatement la présence d'un BOM et vérifie que vos fichiers sont en UTF‑8 sans BOM. Il met en évidence les octets EF BB BF, les fins de ligne et autres caractères problématiques.

✅ Détection automatique

BOM (EF BB BF), fins de ligne, caractères de contrôle

📊 Analyse complète

Positions exactes, encodage, suggestions de correction

🧹 Nettoyage automatique

Suppression du BOM, normalisation en UTF‑8 sans BOM

💾 Export propre

Téléchargement des fichiers convertis et normalisés

Autres méthodes de détection

Affichage dans l'éditeur

Activez l'indicateur d'encodage et forcez "UTF-8 (sans BOM)" lors de l'enregistrement
Installez une extension qui alerte en cas de "UTF-8 with BOM"

En ligne de commande (Unix)

# Détecter un BOM en début de fichier
grep -P "^\xEF\xBB\xBF" fichier.txt
# Identifier l'encodage
file -bi fichier.txt
# Afficher les caractères de contrôle
cat -A fichier.txt
# Voir les octets hexadécimaux
hexdump -C fichier.txt

En code

JavaScript

if (str.charCodeAt(0) === 0xFEFF) { str = str.slice(1); }

Python

with open(path, "r", encoding="utf-8-sig") as f: data = f.read()

Excel / Google Sheets

CODE(GAUCHE(cellule;1)) # 65279 si U+FEFF est présent

Nettoyer et prévenir

🚀 Passez vos fichiers en UTF‑8 sans BOM en un clic

Avant d'écrire des scripts de conversion, utilisez Clean ASCII pour supprimer le BOM et normaliser vos fins de ligne :

Détection du BOM
Conversion UTF‑8 sans BOM
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Configurez l'éditeur pour enregistrer en "UTF-8" (sans BOM) par défaut
Supprimez systématiquement les BOM dans les fichiers UTF‑8
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Écrivez une fonction strip_bom() qui retire EF BB BF en tête
Corrigez les entêtes CSV "id" en "id" lors de l'import
Rejetez les caractères de contrôle non nécessaires en entrée

⚙️ Automatiser

Hook pre-commit qui échoue si un BOM est détecté (grep -rPl "^\xEF\xBB\xBF")
.editorconfig et gitattributes pour imposer UTF‑8 et EOL cohérents
Vérifications CI pour empêcher tout BOM de passer en production

Checklist rapide

Fichiers en UTF-8 sans BOM
Fins de ligne uniformes via gitattributes
Éditeur configuré pour afficher l'encodage et interdire le BOM
Fonction de suppression du BOM dans vos libs
Tests garantissant l'absence de BOM et de caractères de contrôle indésirables
Documentation interne sur l'encodage UTF‑8 sans BOM et les EOL

Conclusion

En adoptant UTF‑8 sans BOM partout, vous éliminez une grande partie des erreurs sournoises liées à l'encodage.

Standardisez l'encodage, supprimez le BOM et normalisez vos fins de ligne : vos pipelines texte, APIs et fichiers de config seront plus prévisibles et robustes.

Vérifiez vos fichiers en UTF‑8 sans BOM

Utilisez notre outil pour détecter et supprimer le BOM, puis exporter des fichiers propres.

Contrôler et convertir