Intermédiaire 8 min de lecture 25 janvier 2025

UTF-16 LE : encodage, pièges et conversions

Vous ouvrez un fichier, tout a l’air normal, mais les outils cassent, les scripts lisent des octets NUL et vos comparaisons échouent. UTF-16 LE est souvent en cause : ordre des octets, BOM en tête et 0x00 entre chaque caractère. Voici comment fonctionne UTF-16 LE, pourquoi il surprend et comment l’identifier et le convertir sans douleur.

Qu'est-ce que UTF-16 LE ?

UTF-16 LE est un encodage Unicode sur 16 bits en ordre d’octets Little Endian. Il peut commencer par un BOM 0xFF 0xFE et insère souvent un octet NUL entre les caractères ASCII.

Voici les principales notions à comprendre sur UTF-16 LE :

1 Endianness et unités de code

UTF-16 encode en unités de 16 bits. En Little Endian, l'octet faible précède l'octet fort.

'A' (U+0041) => 41 00 · '€' (U+20AC) => AC 20 · 😀 (U+1F600) => D8 3D DE 00 (mots BE), bytes LE: 3D D8 00 DE

2 BOM et détection automatique

Le BOM indique l’encodage et l’ordre des octets. En UTF-16 LE, il vaut 0xFF 0xFE.

UTF-16 LE BOM: FF FE · UTF-16 BE BOM: FE FF · UTF-8 BOM: EF BB BF

3 Paires de substitution (surrogates)

Les caractères hors BMP (emojis, symboles musicaux…) utilisent deux unités de 16 bits.

😀 (U+1F600) => D83D DE00 · bytes LE: 3D D8 00 DE
𝌆 (U+1D306) => D834 DF06 · bytes LE: 34 D8 06 DF
Caractères BMP (ex: U+20AC) restent sur une unité: AC 20 (LE)

4 Compatibilité et formats

Beaucoup d’outils attendent UTF-8. UTF-16 LE introduit des 0x00 qui perturbent parseurs et shells.

CSV/JSON en UTF-16 LE mal lus par Unix
Scripts bash bloqués par \x00
HTTP Content-Type: text/plain; charset=utf-16le requis pour l’interprétation correcte

Problèmes classiques

Exports Windows/Excel en UTF‑16 LE

Fichiers .csv ou .txt encodés en UTF‑16 LE non reconnus par des scripts ou outils UNIX.

Tests unitaires qui comparent des chaînes

La valeur lue contient des 0x00 ou un BOM UTF‑16 LE, les égalités échouent.

trim() ou strip() inefficaces

Les octets NUL et BOM ne sont pas retirés, la chaîne paraît vide ou plus longue.

Regex et outils CLI perturbés

Présence de \x00 et encodage 16 bits : grep/sed/awk ne se comportent pas comme prévu.

Exemple de problème courant :

# Deux chaînes semblent identiques, mais l'une provient d'un fichier UTF-16 LE
string1 = "email@domain.com"
string2 = b"\x65\x00\x6d\x00\x61\x00\x69\x00\x6c\x00\x40\x00\x64\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00" # UTF-16 LE: octet NUL entre chaque caractère
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre un fichier “binaire” ou de grands changements invisibles
!
Des CSV importés affichent des caractères vides et colonnes décalées
!
Un .env refuse de charger à cause d’un BOM UTF‑16 LE en tête
!
Votre éditeur indique “UTF‑16 LE” ou montre des symboles 00 en naviguant
!
Un copier-coller dans un terminal insère des octets NUL et casse la commande

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie automatiquement les fichiers et textes en UTF-16 LE, détecte le BOM, les octets NUL et vous indique la meilleure conversion vers UTF-8.

✅ Détection automatique

UTF‑16 LE/BE, BOM, octets NUL, surrogates

📊 Analyse complète

Positions, taille réelle, présence du BOM, erreurs d'encodage

🧹 Nettoyage automatique

Conversion UTF‑16 LE → UTF‑8, suppression du BOM

💾 Export propre

Téléchargement du texte normalisé en UTF‑8 prêt à l’emploi

Autres méthodes de détection

Affichage dans l'éditeur

Ouvrez le fichier avec “Reopen with Encoding” (VS Code, JetBrains, Sublime)
Affichez l’encodage et le BOM dans la barre d’état ou via un plugin

En ligne de commande (Unix)

# Identifier l'encodage déclaré
file -bi fichier.txt
uchardet fichier.txt
# Voir le BOM et les octets NUL
xxd -g 1 -l 32 fichier.txt | sed -n '1,2p'
grep -U -n $'\x00' -H fichier.txt || true
# Convertir en UTF-8
iconv -f utf-16le -t utf-8 fichier.txt > fichier-utf8.txt
recode UTF-16..UTF-8 fichier.txt

En code

JavaScript

new TextDecoder('utf-16le').decode(bytes) // convertir vers UTF-8 (chaîne JS)

Python

open(p, 'rb').read().decode('utf-16le') # ou open(p, encoding='utf-16-le')

Excel / Google Sheets

UNICODE(MID(cellule; position; 1)) // inspecter les points de code

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d’écrire des scripts, utilisez Clean ASCII pour détecter l’UTF‑16 LE, enlever le BOM et convertir en UTF‑8 propre.

Détection encodage et BOM
Conversion UTF‑16 LE → UTF‑8
Export immédiat et propre

Méthodes techniques avancées

🔧 Normaliser

Unifiez vers UTF-8 pour le code, la config et les données texte
Supprimez les BOM inutiles (UTF-8 sans BOM recommandé)
Homogénéisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Convertissez explicitement les entrées UTF‑16 LE avec iconv avant parsing
Retirez le BOM et remplacez/éliminez les octets NUL selon le format
Refusez les encodages non attendus au chargement (whitelist UTF‑8)

⚙️ Automatiser

Hooks pre-commit qui rejettent les fichiers UTF‑16 (file -bi | grep utf-16)
Tests d’E/S validant le charset attendu en entrée/sortie
Linting du pipeline CI pour garantir du texte en UTF‑8

Checklist rapide

Fichiers en UTF-8 sans BOM (pas d’UTF‑16 LE par défaut)
Fins de ligne uniformes via gitattributes
Éditeur affichant encodage et présence de BOM
Fonctions de conversion UTF‑16 LE → UTF‑8 dans vos libs
Tests vérifiant l’absence d’octets NUL et de BOM indésirables
Documentation développeurs sur encodages et retours à la ligne

Conclusion

UTF‑16 LE est utile dans certains contextes, mais surprend dans les pipelines orientés UTF‑8.

Détectez l’encodage tôt, standardisez sur UTF‑8 et éliminez BOM et octets NUL pour des intégrations stables.

Convertissez UTF‑16 LE en UTF‑8 maintenant

Utilisez notre outil pour reconnaître, convertir et nettoyer vos fichiers encodés en UTF‑16 LE.

Convertir mon texte