Intermédiaire 8 min de lecture 25 janvier 2025

koi8 r (KOI8‑R) : encodage, compatibilité et problèmes courants

Vous retournez des caractères illisibles, vos CSV affichent des suites de symboles, vos logs contiennent des « Â », « Ð » ou « Ï ». Très souvent, un texte en koi8 r (KOI8‑R) s’est glissé dans un flux supposé UTF‑8. Voici comment reconnaître KOI8‑R, comprendre ses limites et éviter les corruptions au quotidien.

Qu'est-ce que koi8 r (KOI8‑R) ?

KOI8‑R est un encodage 8 bits historique pour le russe (cyrillique), largement utilisé sur Unix, emails et BBS avant l’adoption massive d’UTF‑8.

Points essentiels à connaître sur koi8 r :

1 Plage ASCII et séparateurs conservés

KOI8‑R conserve l’ASCII imprimable et les séparateurs classiques.

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

2 Octets de contrôle ASCII

Codes 0 à 31 et 127 : toujours présents, comme en ASCII.

NUL (00), BEL (07), ESC (1B), DEL (7F)

3 Cartographie cyrillique KOI8‑R

Spécificités importantes pour koi8 r :

Cyrillique sur 0xC0–0xFF (majuscules/minuscules séparées)
Pas de séquences multi-octets, 1 caractère = 1 octet
Incompatible byte‑à‑byte avec UTF‑8
Lignes de dessin et symboles divers dans 0x80–0xBF

4 Variantes et pièges techniques

À connaître avant toute manipulation :

Pas de BOM pour koi8 r (contrairement à certains flux UTF‑16)
Variantes proches : KOI8‑U, KOI8‑RU
MIME/HTTP: Content-Type: charset=koi8-r

Problèmes classiques

Copier-coller depuis emails/terminaux anciens

Injecte des octets KOI8‑R dans une application qui attend de l’UTF‑8 (mojibake assuré).

Tests unitaires qui échouent

Comparaison de chaînes faussée après une double conversion KOI8‑R ⇄ UTF‑8.

Trim() ou strip() inefficace

Ne corrige pas des octets KOI8‑R mal interprétés; il faut recoder, pas seulement tronquer.

Regex \s ou \w incomplètes

En mode UTF‑8, des octets 0x80–0xFF KOI8‑R peuvent provoquer « malformed UTF‑8 ».

Exemple de problème courant :

# Chaînes visuellement proches mais encodées différemment
string1 = "Привет" # UTF‑8
string2 = "Ïðèâåò" # Texte KOI8‑R lu comme ISO‑8859‑1
assert string1 == string2 # ❌ Échec (mojibake)

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git ajoute des « Â », « Ð », « Ï » après un simple enregistrement
!
Des CSV perdent des colonnes après import: séparateurs mal décodés (koi8 r vs UTF‑8)
!
Un .env contient une valeur avec octets > 0x7F et la lecture échoue
!
Votre éditeur montre � (losange) ou des carrés à la navigation
!
Un copier-coller dans un terminal produit des commandes illisibles

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII met en évidence les octets non‑ASCII et vous aide à repérer rapidement un texte en koi8 r. Il indique les positions suspectes et facilite la conversion vers UTF‑8 de manière fiable.

✅ Détection automatique

Repérage d’octets 0x80–0xFF, heuristiques d’encodage KOI8‑R

📊 Analyse complète

Positions exactes, pourcentage suspect, prévisualisation UTF‑8

🧹 Nettoyage automatique

Conversion KOI8‑R → UTF‑8 et normalisation cohérente

💾 Export propre

Fichier UTF‑8 prêt à l’emploi après correction

Autres méthodes de détection

Affichage dans l'éditeur

Affichez l’encodage du fichier (VS Code, JetBrains) et « Reopen with Encoding »
Alertez sur les octets non‑UTF‑8 et les libellés charset=koi8-r

En ligne de commande (Unix)

# Repérer octets non‑ASCII (candidats KOI8‑R)
grep -P "[^\x09\x0A\x0D\x20-\x7E]" fichier.txt
# Visualiser fins de ligne et tabulations
sed -n l fichier.txt
# Afficher octets et caractères de contrôle
cat -A fichier.txt
# Inspecter les codes hexadécimaux (pistes KOI8‑R)
hexdump -C fichier.txt

En code

JavaScript

new TextDecoder('koi8-r').decode(bytes)

Python

data.decode('koi8_r') # ou s.encode('latin1').decode('koi8_r') pour corriger du mojibake

Excel / Google Sheets

CODE(MID(cellule;position;1))

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d’écrire des scripts, utilisez Clean ASCII pour analyser et convertir un texte koi8 r vers UTF‑8 en quelques secondes :

Détection automatique
Nettoyage intelligent
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Convertissez koi8 r → UTF‑8 via iconv/mb_convert_encoding
Renseignez correctement charset=koi8-r sur HTTP/Email si nécessaire
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Écrivez des fonctions recode_koi8r() pour vos flux entrants
Remplacez les symboles non mappables par des équivalents ASCII
Refusez/validez les entrées non‑UTF‑8 dans vos APIs

⚙️ Automatiser

Hooks pre-commit: vérifier que les fichiers sont UTF‑8 (iconv test)
Sanitisation des inputs utilisateurs avec détection d’encodage
Linting sur la CI pour repérer du koi8 r non désiré

Checklist rapide

Sources et artefacts finaux en UTF‑8 sans BOM
Fins de ligne uniformes via gitattributes
Éditeur configuré pour ouvrir/enregistrer en koi8 r ou UTF‑8 selon le cas
Fonction de recodage KOI8‑R → UTF‑8 dans vos libs
Tests vérifiant l’absence d’octets non‑UTF‑8 dans les payloads
Documentation claire sur koi8 r, UTF‑8 et conversions

Conclusion

koi8 r reste présent dans des systèmes, emails et archives. Savoir l’identifier et le convertir évite des heures perdues face à du texte illisible.

Standardisez sur UTF‑8, contrôlez les encodages aux frontières de vos applications et automatisez la détection: vous éliminerez la plupart des soucis de compatibilité.

Détectez koi8 r et corrigez vos fichiers

Utilisez notre outil pour repérer un encodage KOI8‑R et convertir proprement vos textes en UTF‑8.

Analyser mon texte KOI8‑R