Intermédiaire 8 min de lecture 25 janvier 2025

UTF-16 BE : encodage, détection et problèmes fréquents

Vous manipulez un fichier texte mais tout s’affiche en caractères étranges, des ^@ envahissent le terminal, vos parsers plantent sans raison. Très souvent, le coupable est un encodage en UTF-16 Big Endian (UTF-16 BE). Comprendre l’ordre des octets, le BOM et la conversion vers UTF‑8 permet d’éviter une grande partie de ces erreurs.

Qu'est-ce que UTF-16 BE ?

UTF‑16 BE encode chaque caractère sur 16 bits, en stockant l’octet de poids fort en premier (Big Endian). Il peut commencer par un marqueur (BOM) FE FF indiquant l’ordre des octets.

Voici les éléments clés à connaître sur UTF‑16 BE :

1 Ordre des octets et représentation binaire

Chaque code point basique est stocké sur 2 octets (MSB → LSB).

"ABC" → 00 41 00 42 00 43 (UTF‑16 BE)

2 BOM (Byte Order Mark)

Le BOM en UTF‑16 BE est FE FF. Son absence rend la détection de l’ordre des octets plus difficile.

BOM UTF‑16 BE = FE FF • UTF‑16 LE = FF FE

3 Paires de substituts (surrogates)

Les caractères au-delà de U+FFFF utilisent deux unités de code (haute et basse).

Emoji 😀 (U+1F600) → D83D DE00 (unités UTF‑16)
En octets BE → D8 3D DE 00
Plage substituts : D800–DFFF

4 Points d’attention techniques

Confusions fréquentes entre UTF‑8, UTF‑16 LE et UTF‑16 BE, présence de BOM, et outils non compatibles.

BOM FE FF au début des fichiers BE
Null bytes visibles dans les flux ASCII
Outils qui supposent UTF‑8 par défaut

Problèmes classiques

Fichier UTF‑16 BE traité comme UTF‑8

Apparition de caractères Â, ou ^@ dans les sorties et CSV illisibles.

Tests qui échouent sans raison

Comparaisons binaires fausses à cause d’un BOM ou de null bytes intercalés (00 xx).

Longueurs et trims incohérents

Fonctions de chaîne qui comptent des octets au lieu de caractères, strlen() inattendu.

Regex et parsers perturbés

Expressions régulières écrites pour des octets ASCII qui cassent sur UTF‑16 BE.

Exemple de problème courant :

# Deux chaînes visuellement identiques, encodages différents
utf8 = "email@domain.com"
utf16be = FE FF 00 65 00 6D 00 61 00 69 00 6C 00 40 00 64... # UTF‑16 BE avec BOM
assert utf8 == utf16be # ❌ Échec tant que non converti

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Le diff git voit un fichier binaire ou des changements massifs incompréhensibles
!
Votre CSV affiche des colonnes vides et des caractères ^@ dans un terminal
!
Un .env ne charge pas car encodé en UTF‑16 BE au lieu d’UTF‑8
!
L’éditeur indique “UTF‑16” dans la barre d’état ou montre des symboles étranges
!
Des scripts shell échouent après un copier-coller depuis un fichier encodé en UTF‑16

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie rapidement l’encodage d’un texte, repère UTF‑16 BE et son BOM, et propose une conversion sûre vers UTF‑8, prête pour vos pipelines et applications web.

✅ Détection automatique

BOM FE FF, ordre des octets, validation des unités de code

📊 Analyse complète

Encodage détecté, taille réelle, anomalies et suggestions

🧹 Conversion fiable

UTF‑16 BE → UTF‑8 en préservant tous les caractères

💾 Export propre

Téléchargement en UTF‑8 sans BOM, prêt à l’emploi

Autres méthodes de détection

Affichage dans l'éditeur

Vérifiez l’encodage dans la barre d’état (Reopen with Encoding → UTF‑16 BE)
Activez l’affichage des symboles non imprimables et du BOM

En ligne de commande (Unix)

# Identifier l’encodage détecté
file -I fichier.txt
# Voir le BOM et l’ordre des octets
xxd -g 1 -l 4 fichier.txt
# Convertir vers UTF-8
iconv -f UTF-16BE -t UTF-8 fichier.txt > out.txt
# Inspecter les unités 16 bits
hexdump -v -e '1/2 "%04X\n"' fichier.txt | head

En code

JavaScript

new TextDecoder('utf-16be').decode(bytes)

Python

open('f.txt','rb').read().decode('utf-16-be')

Excel / Google Sheets

UNICODE(MID(cellule;1;1))=65279 # détecte le BOM

Nettoyer et prévenir

🚀 Conversion rapide avec Clean ASCII

Avant d’écrire des scripts personnalisés, essayez Clean ASCII pour convertir un fichier UTF‑16 BE en UTF‑8 proprement :

Détection d’encodage
Suppression du BOM
Export UTF‑8 immédiat

Méthodes techniques avancées

🔧 Normaliser

Convertissez systématiquement vers UTF‑8 pour le web et les API
Supprimez les BOM inutiles dans les flux texte
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Implémentez une fonction to_utf8() (iconv/mb_convert_encoding)
Rejetez les fichiers détectés en UTF‑16 BE si votre pipeline impose UTF‑8
Validez l’absence de surrogates non appariés

⚙️ Automatiser

Hooks pre-commit: refuser les fichiers non-UTF‑8 (file/uchardet)
Sanitiser les inputs utilisateurs et re-encoder côté serveur
Lint d’encodage sur la CI avec conversion automatique si possible

Checklist rapide

Fichiers standardisés en UTF‑8 (sans BOM) pour le déploiement
Fins de ligne uniformes via gitattributes
Éditeur configuré pour afficher l’encodage et le BOM
Fonction utilitaire de conversion UTF‑16 BE → UTF‑8 dans vos libs
Tests qui refusent les fichiers UTF‑16 BE non prévus
Documentation claire sur encodages, BOM et conversions

Conclusion

UTF‑16 BE n’est pas un ennemi, mais il devient source d’erreurs quand il est traité comme UTF‑8. Savoir repérer le BOM, l’ordre des octets et les surrogates vous fait gagner un temps précieux.

Détectez l’encodage, convertissez vers UTF‑8 quand c’est pertinent et intégrez ces contrôles à votre pipeline.

Vérifiez et convertissez vos fichiers UTF‑16 BE

Utilisez notre outil pour identifier UTF‑16 BE, retirer le BOM et convertir en UTF‑8 proprement.

Analyser et convertir