Intermédiaire 8 min de lecture 25 janvier 2025

node iconv lite (iconv-lite) en Node.js : encodages, conversions et pièges à éviter

CSV Windows qui affichent é, API héritées en CP1252, fichiers Shift_JIS, BOM qui casse un JSON.parse… En environnement Node.js, node iconv lite (package iconv-lite) est la solution légère pour décoder/encoder proprement vos textes et éliminer le mojibake sans dépendances natives.

Qu'est-ce que node iconv lite (iconv-lite) ?

Une bibliothèque Node.js pure JavaScript pour décoder et encoder des encodages texte historiques (Windows-1252, ISO-8859-1, Shift_JIS, GBK, KOI8-R, etc.) et gérer le BOM sans compiler quoi que ce soit.

Voici les aspects essentiels de node iconv lite à connaître :

1 Encodages classiques pris en charge

Tous les incontournables pour interopérer avec des systèmes hérités.

cp1252, iso-8859-1, cp1251, koi8-r, shift_jis, gbk, big5, macroman

2 API principale iconv-lite

Une surface simple et prévisible pour convertir en toute sécurité.

decode(buffer, 'win1252') • encode('texte', 'iso-8859-1') • encodingExists('gbk')

3 Cas d'usage fréquents

Ce à quoi vous vous heurtez au quotidien :

CSV Windows → UTF-8 sans mojibake
Requêtes HTTP legacy (cp1252) → UTF-8
Fichiers Shift_JIS/GBK → affichage correct
Nettoyage du BOM pour JSON/ENV

4 Points techniques à retenir

Performance et intégration Node.

Pur JS, aucune dépendance native
Gestion du BOM UTF-8
Streams: decodeStream/encodeStream
Compatibilité Buffer/TypeScript

Problèmes classiques avec les encodages

Mojibake: é, ’, – à l'écran

UTF-8 lu comme ISO-8859-1 (ou inversement). Résolu en décodant correctement avec iconv-lite.

BOM inattendu en tête de fichier

Un BOM UTF-8 peut faire échouer JSON.parse, YAML, ou la lecture d’un .env. À supprimer/ignorer.

Double encodage/décodage

Encoder deux fois ou décoder dans le mauvais ordre produit des artefacts difficiles à voir.

Buffers vs chaînes

Confondre octets et caractères casse les comparaisons et les longueurs réelles.

Exemple de problème courant :

# Deux chaînes qui paraissent identiques mais encodées différemment
string1 = "Café"
string2 = "Café" # UTF-8 lu comme ISO-8859-1
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Le code montre des caractères bizarres (é, –) après lecture d’un fichier
!
Un CSV importé depuis Windows a des colonnes décalées ou du texte illisible
!
Un .env/JSON commence par des caractères invisibles (BOM) et échoue au parsing
!
Votre éditeur vous demande de rouvrir avec un autre encodage
!
Une API legacy renvoie du texte correct dans Postman mais pas dans votre app

Comment l’adopter dans vos projets Node

Solution recommandée : node iconv lite (iconv-lite)

iconv-lite fournit un décodage/encodage fiable des encodages historiques sans dépendances natives. Installez-le, decodez vos buffers entrants, encodez vos sorties et éliminez immédiatement le mojibake.

✅ Décodage/encodage

CP1252, ISO-8859-1, KOI8-R, GBK, Shift_JIS, Big5, MacRoman…

📊 Écosystème Node

Buffer-friendly, API simple, détection d’encodage disponible via libs tierces

🧹 Gestion du BOM

Ignore/retire le BOM UTF-8 lors du décodage pour des parsings fiables

💾 Streams performants

decodeStream/encodeStream pour traiter de gros fichiers

Autres méthodes pratiques

Réglages d’éditeur

VS Code: "Reopen with Encoding", définir UTF-8 par défaut, afficher le BOM
JetBrains/Sublime: forcer l'encodage du projet et la sauvegarde en UTF-8

En ligne de commande (Unix)

# Détecter le type MIME/charset d’un fichier
file -bi fichier.txt
# Convertir CP1252 → UTF-8 avec GNU iconv
iconv -f WINDOWS-1252 -t UTF-8 fichier.txt > sortie.txt
# Repérer un BOM UTF-8
xxd -p -l 3 fichier.txt | grep -i '^efbbbf$'
# Essayer de deviner l’encodage
uchardet fichier.txt

En code

Node.js (iconv-lite)

import iconv from 'iconv-lite'
const buf = await fs.promises.readFile('input_cp1252.txt')
const s = iconv.decode(buf, 'win1252')
const out = iconv.encode(s, 'utf8')
await fs.promises.writeFile('output_utf8.txt', out)

TypeScript

import iconv, { decode, encode } from 'iconv-lite'
const exists: boolean = iconv.encodingExists('koi8-r')
const text: string = decode(Buffer.from(bytes), 'koi8-r')
const bin: Buffer = encode(text.normalize('NFC'), 'utf8')

Streams

import { createReadStream, createWriteStream } from 'fs'
import iconv from 'iconv-lite'
createReadStream('legacy_sjis.txt')
  .pipe(iconv.decodeStream('shift_jis'))
  .pipe(iconv.encodeStream('utf8'))
  .pipe(createWriteStream('normalized_utf8.txt'))

Convertir proprement et prévenir les erreurs

🚀 Solution rapide avec node iconv lite

Avant de bricoler des conversions maison, installez iconv-lite et standardisez toutes vos entrées/sorties en UTF-8 :

Décoder les buffers entrants (CP1252, SJIS, GBK)
Encoder en UTF-8 sans BOM
Traiter de gros fichiers via streams

Méthodes techniques avancées

🔧 Normaliser

Standardisez tout en UTF-8 (sans BOM) côté fichiers et réponses HTTP
Normalisez les chaînes Unicode (NFC) avant l’encodage
Uniformisez les fins de ligne (gitattributes, dos2unix)

🧹 Filtrer

Mappez les ponctuations CP1252 (guillemets, tirets) vers ASCII si nécessaire
Refusez les caractères de contrôle hors LF/CR/HT dans vos pipelines
Ajoutez des garde-fous si l’encodage attendu n’existe pas (encodingExists)

⚙️ Automatiser

Hooks pre-commit: refuser fichiers non UTF-8 ou contenant un BOM
Tests d’intégration: lecture/écriture via iconv-lite et snapshots
CI: linter de fichiers texte, vérification du charset et du BOM

Checklist rapide

Fichiers projet en UTF-8 sans BOM
Header HTTP Content-Type avec charset explicite
iconv-lite installé et utilisé pour toutes les entrées/sorties legacy
Tests couvrant CP1252/ISO-8859-1/Shift_JIS/GBK
CI bloquant BOM et conversions hasardeuses
Documentation interne sur les encodages et la marche à suivre

Conclusion

Avec node iconv lite, vous neutralisez rapidement les problèmes d’encodage et fiabilisez vos pipelines texte en Node.js.

Standardisez en UTF-8, gérez le BOM et encodez/décodez systématiquement vos flux: vous éviterez l’immense majorité des bugs de caractères.

Adoptez node iconv lite dès maintenant

Installez iconv-lite, convertissez vos fichiers et dites adieu au mojibake et aux encodages capricieux.

Installer iconv-lite