Intermédiaire 8 min de lecture 25 janvier 2025

Shift JIS : encodage, problèmes fréquents et solutions pratiques

Texte illisible, caractères en losanges, points d’interrogation, CSV décalés : c’est souvent l’encodage qui déraille. Shift JIS reste courant dans l’écosystème japonais (fichiers Windows, anciens systèmes, exports Excel). Ce contenu clarifie ce qu’est Shift JIS, pourquoi il pose des soucis en 2025 et comment diagnostiquer puis convertir proprement.

Qu'est-ce que Shift JIS ?

C’est un encodage multioctet historiquement utilisé pour le japonais, mélangeant ASCII et caractères sur deux octets.

Voici les éléments clés à connaître sur Shift JIS :

1 Compatibilité ASCII et octets simples

Les octets ASCII standards sont conservés pour la compatibilité.

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

2 Paires multioctets JIS X 0208

Caractères japonais codés sur deux octets : un octet d’amorce suivi d’un octet de fin.

Lead: 0x81–0x9F, 0xE0–0xFC | Trail: 0x40–0x7E, 0x80–0xFC

3 Variantes pleine/demi largeur et ambiguïtés

Cas fréquents à l’origine de divergences visuelles et fonctionnelles :

Kana demi-chasse (JIS X 0201)
Espace pleine largeur (U+3000)
Différences de ponctuation pleine largeur
Tilde et tiret vague non uniformes (U+301C/U+FF5E)

4 Particularités techniques (CP932)

Extensions et différences selon Microsoft/NEC/IBM :

Extensions CP932 (Windows-31J)
Yen sign vs backslash (0x5C) ambigu
Cartographies historiques non 1:1 avec Unicode

Problèmes classiques

Copier-coller depuis Excel/Windows (CP932)

Introduit du Shift JIS dans un flux attendu en UTF-8, produisant du mojibake.

Tests unitaires qui échouent

Une fixture Shift JIS est lue comme UTF-8, les comparaisons de chaînes ne correspondent plus.

Fonctions byte-based trompeuses

substr/strlen coupent au milieu d’un caractère multioctet si mbstring n’est pas utilisé.

Regex sur octets imprécises

Correspondances basées sur \w/\s sans support multioctet cassent des caractères japonais.

Exemple de problème courant :

# Deux chaînes semblent identiques mais l'encodage diffère
string1 = "café"
string2 = "café" # Lu depuis un fichier Shift JIS interprété en UTF-8 (affiche café)
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre des “? ” ou des remplacements � sans modification apparente
!
Des split() ou parse CSV explosent à cause de caractères multioctets
!
Un .env contient des octets non-UTF-8 et ne se charge plus
!
Votre éditeur indique "Shift JIS" ou "CP932" dans la barre d’état
!
Un copier-coller remplace “\” par “¥” et casse vos commandes

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII repère l'encodage probable, affiche les divergences caractérisées et vous aide à convertir les textes Shift JIS vers UTF-8 sans surprises.

✅ Détection de l'encodage

Reconnaissance de Shift JIS/CP932 et différences de cartographie

📊 Analyse complète

Aperçu des octets, positions, caractères problématiques et équivalents Unicode

🧹 Conversion fiable

Transformation Shift JIS → UTF-8 avec options de normalisation

💾 Export propre

Téléchargement du texte ré-encodé prêt pour vos pipelines

Autres méthodes de détection

Affichage dans l'éditeur

VS Code/JetBrains : “Reopen with Encoding” → Shift JIS, puis “Save with Encoding”
Activez l’affichage de l’encodage dans la barre d’état et les caractères invisibles

En ligne de commande (Unix)

# Deviner l'encodage (SJIS/CP932)
nkf --guess fichier.txt
# Voir le type MIME/charset estimé
file -bi fichier.txt
# Convertir Shift JIS vers UTF-8
iconv -f SHIFT_JIS -t UTF-8 fichier.txt > sortie.txt
# Inspecter les octets (plages lead/trail)
hexdump -C fichier.txt

En code

JavaScript

new TextDecoder('shift_jis').decode(bytes)

Python

b.decode("shift_jis", errors="replace")

Excel / Google Sheets

JIS(A1)

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d’écrire des scripts, utilisez Clean ASCII pour détecter automatiquement Shift JIS, visualiser les zones à risque et convertir en UTF-8 sans perdre d’informations.

Détection automatique
Nettoyage intelligent
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Standardisez sur UTF-8 et convertissez les sources Shift JIS en amont (iconv, nkf)
Évitez le BOM en UTF-8 pour limiter les surprises d’interpréteur
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Validez/convertissez les octets hors plage attendue (lead/trail) avant ingestion
Unifiez kana pleine/demi largeur avec mb_convert_kana()
Traitez explicitement le cas “¥” vs “\” dans les chemins et sorties

⚙️ Automatiser

Hooks pre-commit refusant les fichiers non UTF-8 (file -bi, iconv --from-code test)
Tests d’intégration avec fixtures Shift JIS pour sécuriser vos parsers
Linting CI et vérification d’encodage sur chaque artefact texte

Checklist rapide

Fichiers en UTF-8 sans BOM
Fins de ligne uniformes via gitattributes
Éditeur affichant l'encodage et les caractères invisibles
Fonctions multioctets (mbstring) dans vos libs et helpers
Tests vérifiant l'absence d’octets non-UTF-8 en entrée
Documentation sur Shift JIS, CP932 et stratégie de conversion

Conclusion

Shift JIS n’a pas disparu et se croise encore dans des exports, archives et intégrations. Mal identifié ou mal converti, il provoque du mojibake et des erreurs difficiles à tracer.

Adoptez une détection systématique, convertissez tôt vers UTF-8 et outillez vos pipelines : vous évitez l’essentiel des problèmes d’encodage et de parsing.

Détectez et convertissez Shift JIS maintenant

Utilisez notre outil pour identifier l’encodage, visualiser les différences et convertir proprement vers UTF-8.

Analyser mon fichier