Intermédiaire 8 min de lecture 25 janvier 2025

CP437 (Code Page 437) : encodage IBM PC, conversions et pièges courants

CP437 est l’encodage historique des PC IBM/DOS. On le rencontre encore dans des exports industriels, vieux dumps de BBS, archives ZIP commentées, art ASCII ou fichiers générés par des outils sous DOS/FreeDOS. Mal interprété, il produit aussitôt des caractères inattendus, des cadres brisés et du mojibake. Voici l’essentiel pour le reconnaître, le convertir et éviter les pièges dans vos flux modernes basés sur UTF‑8.

Qu'est-ce que CP437 ?

CP437 (aussi appelé IBM437 ou OEM-US) est un encodage 8 bits comprenant l’ASCII standard (0–127) et une extension (128–255) avec diacritiques, symboles et caractères pseudo-graphiques (traits, coins, blocs).

Aperçu des blocs clés dans l’univers CP437 :

1 Base ASCII (0–127) inchangée

Lettres, chiffres, ponctuation, contrôles classiques.

ASCII 0–31 (contrôles), 32–126 (imprimables), 127 (DEL)

2 Caractères de contrôle hérités

Certains codes 0–31 avaient des glyphes en texte-mode, mais restent des contrôles en flux.

NUL (0), BEL (7), ESC (27), DEL (127)

3 Extension 128–255 spécifique CP437

Les octets 0x80–0xFF mappent vers des lettres accentuées et symboles :

é (0x82), ç (0x87), ù (0x97)
░▒▓ (0xB0–0xB2) - densités
─│┌┐└┘┬┴┼ (0xC4–0xDA) - box drawing
█ (0xDB), ▄ (0xDC), ▀ (0xDF)

4 Particularités techniques

Encodage OEM DOS, distinct de Windows‑1252 et CP850 :

Incompatible UTF‑8 par défaut
Diffère de CP850 (Europe de l’Ouest)
Influe sur l’affichage terminal (CHCP)

Problèmes classiques

Mojibake après lecture directe en UTF‑8

Des octets CP437 > 0x7F deviennent � ou des suites type é.

Confusion CP437 ↔ CP1252/CP850

Un "café" en CP437 devient "caf‚" si lu comme CP1252, ou des lettres grecques si pris pour CP850.

Cadres ASCII et art pseudo‑graphique brisés

Les traits ─│┌┐ deviennent des glyphes incohérents après un copier‑coller ou une conversion hasardeuse.

Comparaisons, tri et longueurs incohérents

Après réinterprétation en UTF‑8, les octets changent et les traitements diffèrent (length, tri, hachage).

Exemple de problème courant :

# Même octet, encodages différents ➜ rendu distinct
bytes = [0x63, 0x61, 0x66, 0x82] # 'c','a','f', 0x82 (CP437: é)
cp437 = "café"
cp1252 = "caf‚" # 0x82 = U+201A (virgule basse)
assert cp437 == cp1252 # ❌ Faux

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Votre terminal montre é/è au lieu de é/è après un cat d’un fichier DOS
!
Les cadres ASCII (─│┌┐) sont remplacés par des caractères aléatoires
!
Un diff montre des changements massifs après “réouverture” du fichier dans un autre éditeur
!
Des exports issus de DOS s’affichent correctement seulement après CHCP 437/850
!
Les tests texte échouent entre machines selon la “code page” active

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII détecte immédiatement les octets non-ASCII et aide à reconnaître un fichier issu de CP437. Visualisez les positions problématiques et obtenez une conversion propre vers UTF‑8 tout en conservant les caractères utiles.

✅ Détection automatique

Octets 0x80–0xFF, motifs CP437 et divergences fréquentes

📊 Analyse complète

Positions, octets hex, mappages Unicode attendus

🧹 Nettoyage automatique

Conversion CP437 → UTF‑8, préservation des cadres et accents

💾 Export propre

Téléchargement du texte converti, prêt à intégrer

Autres méthodes de détection

Affichage dans l'éditeur

Activez l’affichage de l’encodage et forcez l’ouverture en CP437 pour vérifier le rendu
Configurez la sauvegarde en UTF‑8 après conversion (VS Code, JetBrains, Sublime)

En ligne de commande (Unix)

# Détecter un encodage probable
file -bi fichier.txt
# Convertir CP437 → UTF-8
iconv -f CP437 -t UTF-8 fichier.txt > fichier-utf8.txt
# Visualiser les octets
hexdump -C fichier.txt
# Rechercher des octets hors ASCII
grep -P "[^\x09\x0A\x0D\x20-\x7E]" fichier.txt

En code

JavaScript

// Node + iconv-lite
require('iconv-lite').decode(Buffer.from(bytes), 'cp437')

Python

text = raw_bytes.decode("cp437")

Excel / Google Sheets

CODE(MID(cellule;position;1))   # repérer les caractères > 127 à convertir

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Ouvrez votre texte, identifiez les octets CP437 et exportez directement en UTF‑8. Clean ASCII facilite la conversion sans perdre les cadres et accents.

Détection CP437 immédiate
Conversion fiable vers UTF‑8
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Convertissez systématiquement CP437 → UTF‑8 avant tout traitement
Préservez les caractères pseudo‑graphiques en mappant vers Unicode (U+2500…)
Uniformisez les fins de ligne et documentez l’encodage attendu

🧹 Filtrer

Remplacez les blocs/traits CP437 par équivalents Unicode ou ASCII selon la cible
Corrigez les diacritiques (é, ç, ù) issus d’une lecture CP1252/UTF‑8 erronée
Éliminez le caractère SUB (0x1A) résidu DOS si présent en fin de fichier

⚙️ Automatiser

Hooks pre-commit pour refuser des fichiers non UTF‑8 ou reconvertir CP437 automatiquement
Tests d’intégration validant que les sorties sont en UTF‑8
Linting CI pour détecter octets 0x80–0xFF suspects en sources

Checklist rapide

Tous les fichiers convertis depuis CP437 vers UTF‑8 (sans BOM)
Fins de ligne uniformes, encodage documenté dans le dépôt
Éditeur configuré pour afficher l’encodage et prévenir les reconversions
Fonctions de conversion CP437 ↔ Unicode dans vos utilitaires
Tests garantissant l’absence de mojibake dans les sorties
Documentation claire: quand CP437 apparaît et comment le convertir

Conclusion

CP437 est toujours présent dans des outils et archives hérités. Le reconnaître et le convertir correctement évite du bruit visuel, des comparaisons faussées et des pipelines instables.

Standardisez vers UTF‑8, automatisez la conversion et gardez un œil sur les caractères pseudo‑graphiques pour un rendu fiable.

Vérifiez et convertissez vos textes CP437

Utilisez notre outil pour détecter CP437, visualiser les octets problématiques et convertir proprement en UTF‑8.

Analyser et convertir maintenant