Intermédiaire 8 min de lecture 25 janvier 2025

GBK : encodage, conversion et problèmes courants

Vous ouvrez un fichier et les caractères chinois deviennent illisibles (乱码) ? Une API retourne du texte correct, mais l’affichage est corrompu ? Ces symptômes viennent souvent d’un encodage GBK traité comme UTF-8 ou l’inverse. Voyons ce qu’est GBK, où il apparaît et comment le gérer sans casse.

Qu'est-ce que GBK ?

GBK est un encodage à double octet pour le chinois simplifié, extension de GB2312, populaire sur Windows (CP936). Il coexiste encore dans de nombreux systèmes hérités et jeux de données.

Voici les principaux aspects à connaître sur GBK :

1 Sous-ensemble ASCII compatible

La plage 0x00–0x7F est identique à ASCII : chiffres, lettres, ponctuation de base.

ASCII (0x20-0x7E), Tab (0x09), CR (0x0D), LF (0x0A)

2 Octets de contrôle et flux binaires

Les codes 0–31/127 restent des contrôles. Leur présence dans du texte peut indiquer un mauvais encodage.

NUL (0x00), BEL (0x07), ESC (0x1B), DEL (0x7F)

3 Plages double-octet spécifiques à GBK

Octets d'amorce 0x81–0xFE suivis de 0x40–0xFE (sauf 0x7F).

0x81-0xFE + 0x40-0xFE (hors 0x7F)
Idéogrammes chinois simplifiés, ponctuation pleine largeur
Guillemets chinois, tirets, symboles spécifiques
Incompatible avec emoji et caractères récents Unicode

4 Variantes et extensions

Contexte autour de GBK dans l'écosystème chinois :

GB2312 (ancêtre), GBK (extension), GB18030 (successeur obligatoire en Chine)
CP936 (Windows-936) ≈ GBK avec quelques différences
Absence de BOM pour GBK, attention à la détection automatique

Problèmes classiques

Copier-coller GBK dans un projet UTF-8

Produit des caractères illisibles (mojibake/乱码) dans des CSV, logs ou pages web.

Tests unitaires qui échouent

Comparaison de chaînes rompue car l’une est UTF-8, l’autre GBK, pour un même texte.

Lecture/écriture avec mauvais encodage par défaut

Un parseur suppose UTF-8 alors que la source est GBK (ou l’inverse).

Regex et limites de mots

Traitement byte-par-byte au lieu d’Unicode complet, erreurs de capture ou de split.

Exemple d'encodage GBK mal interprété :

# Fichier GBK lu comme UTF-8
bytes = b'\xc4\xe3\xba\xc3' # "你好" en GBK
string_utf8 = bytes.decode('utf-8', errors='ignore')
string_gbk = bytes.decode('gbk')
assert string_utf8 == string_gbk # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre des changements après “convert file encoding” sans modification visible
!
Des parseurs CSV ou JSON échouent selon la machine ou le système
!
Un .env contient du texte chinois lisible dans un éditeur, illisible en runtime
!
L’éditeur affiche des losanges � ou des points d’interrogation
!
Coller une commande dans le terminal ajoute des octets non valides

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII met en évidence les octets non-UTF-8, détecte les séquences typiques de GBK et vous aide à identifier rapidement les sections du texte nécessitant une conversion.

✅ Détection automatique

Octets hors ASCII, séquences GBK/CP936, anomalies d’encodage

📊 Analyse complète

Encodage probable, positions exactes, recommandations de conversion

🧹 Nettoyage automatique

Conversion sûre vers UTF-8, options de substitution des symboles

💾 Export propre

Téléchargement du texte converti en UTF-8 prêt à intégrer

Autres méthodes de détection

Affichage dans l'éditeur

Affichez/forcez l’encodage du fichier (Reopen with Encoding, Change File Encoding)
Activez l’indicateur d’encodage dans la barre d’état et un linter d’encodage

En ligne de commande (Unix)

# Identifier l'encodage probable
file -bi fichier.txt
# Tester une conversion vers UTF-8
iconv -f gbk -t utf-8 fichier.txt > sortie.txt
# Détecter des octets > 0x7F (indices de texte non ASCII)
grep -n -P "[\x80-\xFF]" fichier.txt
# Vérifier l'aller-retour GBK -> UTF-8 -> GBK
iconv -f gbk -t utf-8 fichier.txt | iconv -f utf-8 -t gbk -c > /dev/null

En code

JavaScript

require('iconv-lite').decode(Buffer.from(bytes), 'gbk')

Python

import chardet; chardet.detect(data)['encoding']

Excel / Google Sheets

UNICODE(MID(cellule;position;1))

Nettoyer et prévenir

🚀 Conversion rapide avec Clean ASCII

Avant d’écrire des scripts, utilisez Clean ASCII pour inspecter et convertir vos textes encodés en GBK vers UTF-8 en quelques clics.

Détection des octets non-UTF-8
Nettoyage et conversion fiables
Export UTF-8 immédiat

Méthodes techniques avancées

🔧 Normaliser

Standardisez sur UTF-8 sans BOM pour les dépôts et API
Définissez l’encodage dans les entêtes HTTP/HTML et l’EditorConfig
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Refusez ou convertissez toute entrée détectée en GBK vers UTF-8
Convertissez la ponctuation pleine largeur en équivalents ASCII si nécessaire
Bloquez les caractères non représentables dans la cible

⚙️ Automatiser

Hooks pre-commit pour refuser les fichiers non UTF-8 (ou convertir automatiquement)
Tests d’intégration validant encodage et affichage correct
Linting d’encodage dans la CI (file, iconv, chardet)

Checklist rapide

Fichiers en UTF-8 sans BOM
Fins de ligne uniformes via gitattributes
Éditeur montrant l’encodage et permettant “Reopen with Encoding”
Fonctions de conversion GBK ↔ UTF-8 dans vos libs
Tests vérifiant l’absence de mélange d’encodages
Documentation sur UTF-8, GBK, GB18030 et bonnes pratiques d’encodage

Conclusion

GBK reste présent dans de nombreux systèmes et fichiers historiques. Un simple mauvais choix d’encodage suffit à corrompre l’affichage et à casser des traitements.

Adoptez une politique claire (UTF-8 en cible), détectez tôt le GBK et automatisez la conversion pour fiabiliser vos flux texte.

Vérifiez et convertissez GBK maintenant

Utilisez notre outil pour repérer le GBK, diagnostiquer les erreurs d’encodage et convertir proprement vers UTF-8.

Contrôler mon encodage