Encodage des caractères et fins de ligne sous Windows - Les bases du mojibake et de CRLF/LF
· Mis à jour le: · Go Komura · Windows, Encodage des caractères, Mojibake, Fins de ligne, UTF-8, CP932, PowerShell, Unicode
Dans les consultations sur le traitement du texte sous Windows, les questions suivantes se mélangent avec une fréquence remarquable.
- Quelle est la différence entre
Shift_JISetUTF-8 - Pourquoi le mojibake se produit-il
- Quelle est la différence entre
CRLFetLF - On est passé à
UTF-8, alors pourquoi le fichier reste-t-il parfois illisible - Pourquoi le même fichier ne s’affiche-t-il pas de la même façon dans l’éditeur, la console, Excel et Git
Ce sujet n’est pas compliqué parce que le japonais serait difficile. Dans la grande majorité des cas, la cause est que la même suite d’octets a été lue avec une hypothèse différente, ou que le contenu mal lu a été enregistré tel quel.
De plus, sous Windows, le monde Unicode et celui des pages de code (code page) coexistent encore aujourd’hui. À cela s’ajoutent le BOM, le caractère de fin de ligne, la détection automatique des éditeurs, la page de code de la console et la conversion des fins de ligne par Git, ce qui donne l’impression d’un sujet particulièrement compliqué.
Cet article met de l’ordre, pour un usage pratique, dans les confusions fréquentes sous Windows entre Shift_JIS / UTF-8 / UTF-16, dans les raisons du mojibake, dans la différence entre CRLF et LF, et dans les raisons pour lesquelles ce sujet prête autant à confusion.
Le contenu s’appuie sur les informations publiques de Microsoft Learn, PowerShell, Git et W3C / Unicode telles qu’elles étaient au mois d’avril 2026. Pour plus de détails, voir les références en fin d’article.
Table des matières
- Ce qu’il faut retenir en premier
- Décomposer le vocabulaire
- 2.1 En quoi Unicode / UTF-8 / UTF-16 / CP932 diffèrent
- 2.2 Comment penser
Shift_JISface àCP932 - 2.3 Les pièges des mots
ANSI,UnicodeetUTF-8N
- Pourquoi le mojibake se produit
- 3.1 Ce qu’est vraiment le mojibake
- 3.2 Affichage corrompu et corruption des données sont deux choses différentes
- 3.3 Convertir vers des caractères non représentables est irréversible
- Les différences entre caractères de fin de ligne
- 4.1
CRLF/LF/CR - 4.2 La fin de ligne est un problème distinct de l’encodage
- 4.3
\net les octets de fin de ligne du fichier ne coïncident pas toujours
- 4.1
- Pourquoi c’est particulièrement déroutant sous Windows
- 5.1 Unicode et les pages de code legacy coexistent
- 5.2 Les étiquettes ne sont pas alignées
- 5.3 Le contenu tout-ASCII masque le problème
- 5.4 Contenu du fichier, nom du fichier, console et fichier source sont des couches distinctes
- 5.5 Le BOM et la fin de ligne jouent aussi sur d’autres axes
- 5.6 Les outils modifient les choses de leur propre initiative
- Schémas d’incidents fréquents
- Règles pour réduire les incidents en pratique
- Mener l’investigation sur le mojibake et les écarts de fin de ligne avec ces 5 questions
- Résumé
- Articles connexes
- Références
1. Ce qu’il faut retenir en premier
En posant d’abord les conclusions, sept points sont particulièrement importants.
- Un fichier texte n’est pas la chaîne de caractères elle-même, mais se compose d’octets + un encodage de caractères + un caractère de fin de ligne. Un BOM peut parfois s’y ajouter.
- Le mojibake se produit quand les mêmes octets sont décodés avec un encodage différent.
- Les problèmes de fin de ligne surviennent quand l’encodage est correct mais que l’hypothèse sur le séparateur de ligne est erronée.
UnicodeetUTF-8ne signifient pas la même chose.Unicodeconcerne le jeu de caractères, tandis queUTF-8etUTF-16concernent l’encodage.- Ce que l’on appelle «
Shift_JIS» sous Windows gagne, en pratique, à être considéré comme CP932 / une page de code japonaise de la famille Windows : les échanges dérivent moins ainsi. - Dire « on est passé à l’UTF-8 » ne constitue pas encore une spécification suffisante. Ce n’est une véritable règle d’exploitation qu’une fois décidées la présence ou non d’un BOM et le caractère de fin de ligne.
- La source de la confusion n’est pas le japonais lui-même, mais la coexistence, sur une même machine Windows, de plusieurs hypothèses issues d’histoires différentes.
Pour traiter du texte sous Windows, le point de départ consiste à distinguer d’abord ces quatre éléments :
- Quels sont les octets de ce fichier
- Avec quel encodage a-t-il été écrit
- Avec quel encodage est-il lu
- La fin de ligne est-elle en
CRLFou enLF
Le simple fait de distinguer ces points réduit déjà considérablement les hésitations.
2. Décomposer le vocabulaire
2.1 En quoi Unicode / UTF-8 / UTF-16 / CP932 diffèrent
Il est d’abord plus rapide de décomposer une fois pour toutes ce vocabulaire.
| Terme | Ce qu’il désigne | Exemple | Confusion fréquente |
|---|---|---|---|
| Unicode | Un cadre pour représenter les caractères par des numéros | U+3042 (あ) |
Le confondre avec UTF-8 |
| UTF-8 | Un encodage qui transforme Unicode en octets | E3 81 82 |
Le croire être Unicode lui-même |
| UTF-16LE | Un encodage qui transforme Unicode en octets | 42 30 |
Confondu avec l’entrée « Unicode » des menus |
| CP932 | La page de code japonaise legacy de Windows | 82 A0 |
Le croire strictement identique à Shift_JIS |
| CRLF / LF | Les octets séparant les lignes | 0D 0A / 0A |
Les prendre pour une sorte d’encodage |
| BOM | Les octets d’identification en tête de fichier | EF BB BF, etc. |
Le prendre pour un nom d’encodage |
Même pour un seul caractère comme あ, les octets diffèrent selon l’encodage.
Caractère : あ
UTF-8 : E3 81 82
CP932 : 82 A0
UTF-16LE : 42 30
L’essentiel est que les caractères et les octets sont deux choses différentes. Une application manipule à l’écran ce qui ressemble à des « caractères », mais pour l’enregistrement ou la transmission, ce sont en fin de compte des octets qui s’échangent. Les incidents se produisent presque toujours à la frontière de cette conversion.
2.2 Comment penser Shift_JIS face à CP932
Sur le terrain, on regroupe souvent les fichiers texte des Windows japonais sous l’appellation « Shift_JIS ». Cela fonctionne à l’oral, mais c’est un peu imprécis en pratique.
Pour être plus précis sur le texte legacy japonais de Windows, il est plus sûr de penser en termes de CP932, ou de page de code japonaise de la famille Windows.
Rester approximatif sur ce point fait dériver des échanges comme ceux-ci :
- On a demandé « enregistre en
Shift_JIS», mais l’interlocuteur avait en tête le CP932 côté Windows - Côté Linux / macOS, le fichier a été traité comme
shift_jis, mais certains fichiers d’origine Windows ne se reproduisent pas correctement - On a demandé un enregistrement en « ANSI », mais la page de code réellement utilisée dépendait de l’environnement
C’est pourquoi, dans les spécifications ou les notes d’investigation, il est plus sûr d’écrire autant que possible :
CP932plutôt queShift_JISACP (active code page) / généralement CP932 en environnement japonaisplutôt queANSI- Quelque chose de concret comme
UTF-8 no BOM, LFplutôt quetext
2.3 Les pièges des mots ANSI, Unicode et UTF-8N
Autour de Windows, les étiquettes verbales elles-mêmes sont aussi une source de confusion.
Ces trois-là prêtent particulièrement à confusion.
ANSICe terme apparaît dans l’interface Windows ou dans d’anciennes documentations, mais il ne s’agit pas d’ASCII. Dans la plupart des cas, il désigne la page de code active (active code page) de la machine.UnicodeDans certains éditeurs ou outils, l’entrée « Unicode » du menu peut en réalité désigner UTF-16LE. Dire « je l’ai enregistré en Unicode » ne signifie donc pas forcémentUTF-8.UTF-8NOn le rencontre parfois dans des éditeurs du marché japonais ; il s’agit normalement d’une étiquette d’interface destinée à distinguer UTF-8 sans BOM. Ce n’est pas un nom d’encodage officiel.
Autrement dit, sous Windows, un même mot change de sens d’un outil à l’autre. C’est le premier grand point de confusion.
3. Pourquoi le mojibake se produit
3.1 Ce qu’est vraiment le mojibake
Ce qu’est vraiment le mojibake est en fait assez simple.
- Une chaîne de caractères est transformée en octets avec un certain encodage
- Ces octets sont retransformés en chaîne avec un encodage différent
- Si les hypothèses ne correspondent pas, on obtient une chaîne différente
Par exemple, si l’on enregistre あ en UTF-8, on obtient les octets suivants.
E3 81 82
Lus comme de l’UTF-8, ces octets redonnent あ ; mais lus sous l’hypothèse CP932, ils apparaissent comme une chaîne différente, du type 縺�.
Ce qui est cassé à ce moment-là n’est pas « le japonais », mais l’hypothèse de décodage.
En une phrase, le mojibake, c’est :
Les mêmes octets ont été lus avec un encodage différent.
3.2 Affichage corrompu et corruption des données sont deux choses différentes
Ce qui compte ici, c’est de distinguer le stade où l’on peut encore revenir en arrière du stade où c’est devenu difficile.
Par exemple, le déroulement suivant permet encore, potentiellement, de revenir en arrière :
- Un fichier UTF-8 est ouvert en tant que CP932
- À l’écran, cela apparaît comme
縺� - Rien n’a encore été enregistré
À ce stade, les octets d’origine restent encore en UTF-8. Rouvrir le fichier avec le bon encodage permet souvent de tout récupérer.
Le déroulement dangereux est celui-ci :
- Un fichier UTF-8 est mal lu comme du CP932
- Le contenu qui apparaît corrompu est enregistré tel quel
- Les octets UTF-8 d’origine sont perdus
Une fois qu’on en arrive là, ce n’est plus un simple problème d’affichage, mais une véritable corruption de données.
En pratique, plutôt que de tout résumer par « ça s’est corrompu », il est important de distinguer au moins ces deux questions :
- Les octets eux-mêmes sont-ils encore corrects
- Le contenu mal lu a-t-il déjà été réenregistré
3.3 Convertir vers des caractères non représentables est irréversible
Un autre point dangereux est celui où l’on convertit une chaîne Unicode vers une page de code restreinte comme CP932.
Si la chaîne contient des caractères qui n’existent pas côté cible, l’un des cas suivants se produit :
- Ils sont remplacés par
? - Un caractère de remplacement est inséré
- La conversion échoue avec une erreur
- Ils sont rapprochés d’un caractère proche
Par exemple, certains emoji ou kanji étendus ne peuvent pas être convertis tels quels vers CP932. Ce type d’incident doit être évalué non pas en fonction de « est-ce lisible ? », mais de « une conversion aller-retour redonne-t-elle l’original ? ».
Une information perdue une fois ne revient pas, même si l’on découvre ensuite le bon encodage.
4. Les différences entre caractères de fin de ligne
4.1 CRLF / LF / CR
La fin de ligne, elle aussi, se résume à des octets.
CR= carriage return =0DLF= line feed =0A- Les fichiers texte de Windows utilisent traditionnellement
CRLF(0D 0A) - Les systèmes Linux / Unix utilisent généralement
LF(0A) - Le
CRseul peut apparaître dans des contextes anciens, comme les vieux systèmes Mac
Sous forme de tableau :
| Fin de ligne | Octets | Contexte principal |
|---|---|---|
CRLF |
0D 0A |
Fichiers texte Windows traditionnels, outils legacy |
LF |
0A |
Linux / macOS / la plupart des outils de développement |
CR |
0D |
Données legacy assez anciennes |
4.2 La fin de ligne est un problème distinct de l’encodage
Ce point est vraiment important.
Le caractère de fin de ligne est un problème distinct de l’encodage.
Un même fichier UTF-8 peut avoir des fins de ligne en CRLF comme en LF.
Par exemple, pour un contenu « A, saut de ligne, B », les octets changent comme suit :
UTF-8 + LF : 41 0A 42
UTF-8 + CRLF : 41 0D 0A 42
Autrement dit, les cas suivants sont parfaitement possibles :
UTF-8, mais seule la fin de ligne diffèreCP932, mais la fin de ligne est enLFUTF-16LE, mais la fin de ligne est enCRLF
Ainsi, quand on constate que « même passé en UTF-8, ça ne va toujours pas », il arrive en réalité que seule la fin de ligne soit en cause, et non l’encodage.
4.3 \n et les octets de fin de ligne du fichier ne coïncident pas toujours
C’est ici que se cache une confusion discrète, du point de vue du programmeur.
Écrire \n dans le code source ne garantit pas que seul 0A se retrouvera dans le fichier.
Selon le langage, le runtime ou le mode texte (text mode) de l’API d’E/S, \n peut être converti en CRLF sous Windows.
Autrement dit, les éléments suivants peuvent diverger :
- la notation de la fin de ligne dans le code source
- la chaîne au moment de l’exécution
- les octets enregistrés dans le fichier
- la fin de ligne visible dans l’éditeur
C’est ainsi que se produit l’incident : « je pensais avoir écrit du LF, mais le fichier était en CRLF ».
Les éditeurs récents gèrent normalement le LF seul, mais les outils périphériques, les applications legacy et les pratiques d’exploitation métier reposent encore souvent sur l’hypothèse CRLF.
C’est pourquoi les problèmes de fin de ligne ne relèvent pas du « passé » : ils surviennent encore couramment en pratique aujourd’hui.
5. Pourquoi c’est particulièrement déroutant sous Windows
5.1 Unicode et les pages de code legacy coexistent
C’est la principale raison pour laquelle Windows est compliqué.
Windows conserve les deux voies :
- celle qui utilise Unicode
- celle qui repose sur les pages de code
Les applications récentes, le web et les actifs multiplateformes tendent à privilégier l’UTF-8, tandis que les anciens CSV, TXT, journaux, l’écosystème Excel et les intégrations de systèmes métier conservent encore le CP932. De plus, l’UTF-16LE apparaît couramment dans certaines sorties ou autour de certaines API.
Autrement dit, plusieurs cultures du texte cohabitent au sein d’une même machine Windows.
5.2 Les étiquettes ne sont pas alignées
Ce qui multiplie la confusion, ce n’est pas tant la technologie elle-même que le décalage des étiquettes.
- On dit
Shift_JIS, mais la réalité est du CP932 - On dit
ANSI, mais la réalité est la page de code active - On dit
Unicode, mais la réalité est de l’UTF-16LE - On dit
UTF-8, mais la présence ou non d’un BOM n’a jamais été tranchée - Des étiquettes propres à certains éditeurs, comme
UTF-8N, font leur apparition
Rester flou sur ce point donne l’impression que la conversation fonctionne, alors que les réalités sous-jacentes ne coïncident pas.
5.3 Le contenu tout-ASCII masque le problème
Ce point pèse lourd également.
Comme l’UTF-8 est compatible avec la plage ASCII, un fichier ne contenant que des caractères alphanumériques et des symboles peut « sembler à peu près lisible » même sous une mauvaise hypothèse. Côté CP932 aussi, la plage équivalente à l’ASCII s’affiche rarement de façon visiblement corrompue, si bien que le problème ne fait pas surface.
Il en résulte une situation de ce type :
- Une configuration entièrement en anglais paraît sans problème
- Dès qu’une ligne de japonais est ajoutée, tout se corrompt
- Un problème resté latent se déclenche pour la première fois en cours d’exploitation
C’est pourquoi les incidents d’encodage donnent souvent l’impression que « ça marchait encore hier, et ça s’est soudainement cassé aujourd’hui ». En réalité, il s’agit le plus souvent d’une mine posée depuis longtemps, qui n’est devenue visible qu’au moment où un caractère non-ASCII est apparu.
5.4 Contenu du fichier, nom du fichier, console et fichier source sont des couches distinctes
Sous Windows, regrouper tout ce qui suit sous l’appellation « encodage des caractères » prête à confusion :
- le nom de fichier / le chemin
- le contenu du fichier
- l’affichage dans la console
- l’encodage du fichier source de code lui-même
- la représentation de la chaîne à l’exécution
- l’affichage dans le presse-papiers ou les composants d’interface graphique
Par exemple, même si un nom de fichier en japonais s’affiche normalement, le contenu du fichier peut être enregistré en CP932. Inversement, même si le fichier lui-même est en UTF-8, seul l’affichage sera corrompu si la page de code de la console ne correspond pas.
Une commande comme chcp 65001 agit fondamentalement sur l’hypothèse côté console ; elle ne modifie pas les octets des fichiers existants.
De plus, même si le fichier source de code est en UTF-8, le fichier journal écrit à l’exécution n’est pas forcément lui aussi en UTF-8. Il faut à chaque fois clarifier de quelle couche d’encodage on parle.
Notons par ailleurs que, sur les Windows japonais, \ peut s’afficher comme un signe yen, ce qui a également tendance à se mêler aux discussions sur l’encodage.
Dans la plupart des cas, il s’agit toutefois d’un problème de police d’affichage ou de glyphe : le sens du caractère comme séparateur de chemin ou caractère d’échappement n’a pas changé.
5.5 Le BOM et la fin de ligne jouent aussi sur d’autres axes
Dire simplement « UTF-8 » ne règle encore que la moitié de la question.
En pratique, les éléments suivants comptent également :
- Y a-t-il un BOM ou non
- La fin de ligne est-elle en
CRLFou enLF
Par exemple, pour un même UTF-8 :
- certains outils Windows ne le lisent correctement que si un BOM est présent
- certains traitements côté Unix récupèrent un caractère parasite en première colonne quand un BOM est présent
- certains outils legacy ont du mal avec le
LFseul - le
CRLFpeut perturber les scripts shell ou alourdir les diffs
Ainsi, même avec un encodage correctement aligné, un incident reste possible.
5.6 Les outils modifient les choses de leur propre initiative
Ce qui complique encore les choses, c’est que les outils locaux modifient les choses de manière implicite.
- L’éditeur effectue une détection automatique
- Un BOM est ajouté ou retiré au moment de l’enregistrement
- Git convertit entre
CRLFetLF - Le shell ou une commande enregistre avec son encodage par défaut
- Un export CSV utilise une page de code inattendue
- Les valeurs par défaut diffèrent selon la version de PowerShell ou de l’outil
Autrement dit, même quand l’opérateur n’a rien précisé, une couche ou une autre ajoute d’elle-même sa propre hypothèse — c’est le quotidien de la pratique sous Windows.
C’est là la véritable explication du « je n’ai rien changé, et pourtant ça s’est cassé ». En réalité, ce n’est pas rare que ce soit la valeur par défaut d’un outil, et non une personne, qui ait modifié quelque chose.
6. Schémas d’incidents fréquents
Voici, sous forme de tableau, les incidents typiques.
| Situation | Ce qui est réellement en décalage | Symptôme typique |
|---|---|---|
Un outil Windows legacy considère un fichier de configuration UTF-8 no BOM comme de l’ANSI / CP932 |
Hypothèse de décodage | Seul le japonais devient illisible |
| Un CSV en CP932 est transmis à un système supposant de l’UTF-8 | Hypothèse de décodage | �, erreurs de décodage, japonais incompréhensible |
| Un journal en UTF-16LE est transmis à un outil texte de type Unix | Hypothèse d’encodage | Des octets NUL se mêlent au contenu, qui semble binaire |
Un fichier source en LF est converti en CRLF dans un autre environnement |
Hypothèse de fin de ligne | Diff de fin de ligne massif, dysfonctionnement de scripts |
| Le contenu mal lu est enregistré tel quel | Les octets eux-mêmes deviennent autre chose | Corruption de données irréversible |
| La spécification se limite à « produire un CSV » | L’interface n’est pas définie | Lisible dans Excel, mais corrompu dans un autre outil |
| On décide seulement « standardiser sur UTF-8 » | Le BOM / la fin de ligne ne sont pas définis | Seuls certains outils échouent |
Le schéma le plus dangereux est celui où l’on constate un affichage corrompu, puis on enregistre quand même, ce qui scelle l’incident.
7. Règles pour réduire les incidents en pratique
À partir d’ici, il s’agit de déterminer quelles règles d’exploitation permettent de réduire les incidents.
7.1 Décider la référence pour les nouveaux fichiers texte
Pour un nouveau fichier, il est raisonnable de faire de l’UTF-8 le premier choix. Cela ne suffit toutefois pas à soi seul.
Il est plus sûr de trancher au minimum les points suivants :
UTF-8 with BOMouUTF-8 no BOM- La fin de ligne en
CRLFou enLF - Qui va lire ce fichier
- Une compatibilité avec d’anciens outils Windows est-elle nécessaire
- Linux / macOS / la CI / les conteneurs le liront-ils également
Par exemple, pour du code source ou une configuration destinés à être multiplateformes, UTF-8 no BOM + LF est souvent le premier choix. En revanche, s’il faut s’aligner sur d’anciens outils Windows ou sur des pratiques d’exploitation existantes, UTF-8 with BOM, voire CP932 + CRLF, peuvent rester nécessaires.
Ce qui compte, ce n’est pas de trancher selon des considérations générales sur « ce qui est correct », mais en fonction de avec qui les données sont échangées.
7.2 Ne pas convertir à la légère les fichiers legacy existants
Si un fichier existant est en CP932, il est plus sûr de ne pas le convertir en UTF-8 à l’occasion d’une petite modification courante.
L’exploitation prudente consiste à :
- Conserver, pour les fichiers existants, l’encodage / le BOM / la fin de ligne d’origine
- Traiter la conversion d’encodage comme une tâche de migration séparée
- Ne procéder à une conversion en masse qu’après avoir vérifié le périmètre concerné et les consommateurs en aval
Les incidents de mojibake naissent souvent d’une bonne intention du type « on en profite pour moderniser ».
7.3 Traiter l’encodage et la fin de ligne comme faisant partie de l’interface
Pour les CSV, TXT, journaux, fichiers de configuration et protocoles simples, ce n’est pas seulement le contenu, mais le format texte lui-même qui constitue l’interface.
Il est plus sûr d’indiquer, dans la spécification, au moins :
- l’encodage
- la présence ou non d’un BOM
- le style de fin de ligne
- la présence ou non d’un en-tête
- les règles de guillemets / de séparateur
- avec quel outil cela a été validé
Par exemple, les trois lettres CSV ne suffisent pas.
Ce n’est qu’en écrivant quelque chose comme UTF-8 with BOM, CRLF, séparateur virgule, avec en-tête que la conversation cesse de dériver.
7.4 Être explicite aux frontières de lecture/écriture
Côté code également, il est plus sûr de ne pas s’en remettre à des valeurs par défaut implicites.
- Préciser explicitement l’encodage lors des lectures / écritures de fichiers
- Rester attentif à l’encodage lors des échanges de texte entre processus
- Fixer également la fin de ligne dans la spécification des traitements d’export / import
- Ne pas faire d’une redirection shell improvisée un chemin de production
Sous Windows en particulier, « avoir réussi à enregistrer » et « avoir enregistré avec les bons octets » ne sont pas la même chose.
7.5 Partager aussi les règles de Git et de l’éditeur
Git n’est pas un outil qui corrige automatiquement l’encodage. En revanche, une conversion peut intervenir sur les fins de ligne.
C’est pourquoi il est plus sûr de décider, par dépôt (repository) :
- Si le code source doit avoir
LFcomme référence - Si le texte réservé à Windows peut tolérer
CRLF - Comment fixer cela via
.gitattributes - Comment partager les réglages d’éditeur
Il est important de penser séparément l’encodage et la fin de ligne. Même si Git harmonise les fins de ligne, les incidents d’encodage subsistent tels quels.
7.6 Ne pas s’arrêter à « c’est corrompu » — dire ce qui est en décalage
Sur le terrain, cette reformulation est souvent très efficace.
- Mauvaise formulation : « C’est corrompu »
- Bonne formulation : « Il semble qu’un fichier UTF-8 no BOM soit ouvert avec l’hypothèse CP932 »
- Mauvaise formulation : « Les fins de ligne sont bizarres »
- Bonne formulation : « Un fichier en LF est converti en CRLF, ce qui gonfle le diff »
Le simple fait de pouvoir exprimer ce qui est en décalage change considérablement la vitesse de l’investigation.
8. Mener l’investigation sur le mojibake et les écarts de fin de ligne avec ces 5 questions
En cas d’hésitation durant l’investigation, revenir aux cinq questions suivantes est la voie la plus rapide.
- Quels sont, en ce moment, les octets de ce fichier
- Est-ce de l’UTF-8 ?
- De l’UTF-8 with BOM ?
- Du CP932 ?
- De l’UTF-16LE ?
- Qui l’a écrit en premier, et sous quelle hypothèse
- un éditeur
- une application legacy
- un export Excel
- un shell / script
- un batch / middleware
- Qui le lit maintenant, et sous quelle hypothèse
- la détection automatique de l’éditeur
- la page de code de la console
- l’encodage par défaut de la bibliothèque
- la spécification côté import
- Quels sont le BOM et la fin de ligne
- BOM présent / absent
CRLF/LF
- Le contenu mal lu a-t-il déjà été enregistré
- Est-ce encore uniquement un problème d’affichage ?
- A-t-il déjà été réenregistré, avec perte des octets d’origine ?
Une fois ces cinq questions renseignées, la cause devient généralement visible.
9. Résumé
Si l’encodage des caractères et les fins de ligne semblent compliqués sous Windows, ce n’est pas parce que le japonais lui-même serait difficile. C’est parce que les octets, l’encodage, le BOM, la fin de ligne et les valeurs par défaut des outils existent de façon indépendante, et que par-dessus tout cela, les cultures textuelles anciennes et nouvelles cohabitent sous Windows.
Les six points suivants méritent particulièrement d’être retenus :
- Le mojibake est le résultat de la lecture des mêmes octets avec un encodage différent
- Les problèmes de fin de ligne relèvent d’un axe distinct de l’encodage
- Ne pas faire une confiance excessive, telle quelle, aux mots
Shift_JIS,CP932,ANSI,Unicode - Dire « on est passé à l’UTF-8 » ne suffit pas : le BOM et la fin de ligne sont également nécessaires
- Distinguer l’affichage corrompu de la corruption de données déjà réenregistrée
- Dans les spécifications, écrire non pas
textmais quelque chose commeUTF-8 no BOM, LF
En résumé, pour traiter du texte sous Windows, l’approche la plus pragmatique consiste à considérer qu’il ne s’agit pas d’« une question de chaînes de caractères », mais d’une question portant sur la manière d’aligner le contrat sur les octets.
10. Articles connexes
- Comprendre les encodages de caractères sous Windows - Pourquoi le mojibake se produit, et ce qui dérape particulièrement en combinaison avec Linux
- Bonnes pratiques pour réduire les incidents de mojibake avec Codex sous Windows - Décider « comment donner ses instructions » avant de peaufiner l’environnement
11. Références
- Microsoft Learn, Code Page Identifiers - Win32 apps https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
- Microsoft Learn, about_Character_Encoding - PowerShell https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_character_encoding?view=powershell-7.6
- Microsoft Learn, Understanding file encoding in VS Code and PowerShell https://learn.microsoft.com/en-us/powershell/scripting/dev-cross-plat/vscode/understanding-file-encoding?view=powershell-7.6
- W3C Internationalization, Character encodings: Essential concepts https://www.w3.org/International/articles/definitions-characters/
- Git documentation, gitattributes https://git-scm.com/docs/gitattributes
- Git documentation, git-config https://git-scm.com/docs/git-config
Articles associés
Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.
Gestion des erreurs et conception des nouvelles tentatives sous PowerShell — du piège du try/catch aux bonnes pratiques d'exit code et de retry
Cet article présente, du point de vue pratique, la différence entre erreurs terminales et non terminales sous PowerShell, le piège du try...
Politique d'exécution PowerShell et signature de scripts — Guide pratique pour sortir de l'exploitation « on colmate avec Bypass »
La politique d'exécution de PowerShell est « un dispositif de sécurité, pas une frontière de sécurité ». Cet article présente les différe...
Les tâches du Planificateur de tâches qui ne s'exécutent pas ou se terminent en 0x1 — isoler la cause et concevoir une exploitation fiable
Guide de conception pour mettre le Planificateur de tâches Windows en exploitation fiable : comptes d'exécution et types de connexion, ca...
Comment exécuter PowerShell depuis C# (CSharp) et récupérer le résultat sous forme d'objets
Comment lancer PowerShell depuis C# et récupérer le résultat sous forme de PSObject plutôt que de chaînes de caractères : un tour d'horiz...
Structurer les tests PowerShell avec Pester — une méthode pratique pour rendre les scripts d'exploitation plus difficiles à casser
Un guide pratique pour tester des scripts PowerShell avec Pester v5 : gestion des dates, opérations sur les fichiers, logique de suppress...
Sujets associés
Ces pages replacent le sujet dans un contexte plus large de services et de décisions.
Thèmes techniques Windows
Portail des sujets sur le développement Windows, l'analyse des incidents et la valorisation des actifs existants.
Services liés à ce sujet
Cet article est directement lié aux services suivants.
Conseil technique et revue de conception
Dans les projets où les hypothèses d'encodage des CSV, journaux et fichiers de configuration divergent entre Windows et Linux, clarifier en amont le contrat d'E/S et les règles d'exploitation permet le plus souvent de réduire les incidents.
Développement d'applications Windows
Dans les outils métier Windows, il est fréquent que CP932 et UTF-8 cohabitent sur le terrain ; intégrer dès la conception la gestion de l'encodage des caractères et des fins de ligne a un impact direct sur la maintenabilité.
Questions fréquentes
Questions souvent posées lors d’une consultation sur le sujet de cet article.
- Pourquoi le mojibake (texte corrompu) se produit-il ?
- Parce qu'une même suite d'octets est lue avec un encodage différent de celui utilisé lors de son écriture. Par exemple, le caractère « あ » enregistré en UTF-8 devient les octets E3 81 82, mais si on les lit en supposant du CP932, on obtient une chaîne différente, du type « 縺 ». Ce qui est « cassé » à ce moment-là n'est pas le japonais lui-même, mais l'hypothèse de décodage. Cela dit, si le contenu mal lu est réenregistré tel quel, les octets d'origine sont perdus : on passe alors d'un simple problème d'affichage à une véritable corruption de données. Il est donc essentiel de rouvrir le fichier avec le bon encodage avant tout enregistrement.
- Quelle est la différence entre CRLF et LF ?
- C'est une différence d'octets utilisés pour séparer les lignes. CRLF correspond aux deux octets 0D 0A et est traditionnellement utilisé dans les fichiers texte de Windows, tandis que LF correspond à l'octet unique 0A et est courant sous Linux / macOS ainsi que dans de nombreux outils de développement. Le point important est que le caractère de fin de ligne est un problème distinct de l'encodage des caractères. Un même fichier en UTF-8 peut avoir des fins de ligne en CRLF comme en LF ; ainsi, quand on constate que « même en UTF-8, ça ne va toujours pas », il arrive que seul le caractère de fin de ligne soit en cause, et non l'encodage.
- Shift_JIS et CP932 sont-ils la même chose ?
- À l'oral, cela passe, mais en pratique il est plus sûr de les distinguer. Pour parler avec précision du texte legacy des Windows japonais, il vaut mieux penser en termes de CP932, ou de page de code japonaise de la famille Windows. De la même façon, sous Windows, « ANSI » désigne le plus souvent la page de code active (active code page) de la machine, et l'entrée « Unicode » dans le menu de certains éditeurs peut en réalité signifier UTF-16LE. Dans les spécifications ou les notes d'investigation, écrire quelque chose de concret comme « UTF-8 no BOM, LF » limite les malentendus.
- Que faut-il fixer dans la spécification d'un fichier texte ?
- Se contenter de dire « on passe à l'UTF-8 » ne suffit pas : ce n'est une véritable règle d'exploitation qu'à partir du moment où l'on a aussi tranché la présence ou non d'un BOM et le caractère de fin de ligne. Pour des fichiers d'échange comme les CSV ou les journaux, il est plus sûr de préciser jusqu'à l'encodage, la présence ou non d'un BOM, le caractère de fin de ligne, la présence ou non d'un en-tête et le séparateur. Pour du code source ou une configuration destinés à être multiplateformes, UTF-8 no BOM + LF est souvent le premier choix ; en revanche, s'il faut s'aligner sur d'anciens outils Windows, UTF-8 with BOM ou même CP932 + CRLF peuvent rester nécessaires.
Profil de l’auteur
Page de présentation de l’auteur de l’article.
Go Komura
Représentant de KomuraSoft LLC
Spécialisé dans le développement de logiciels Windows, le conseil technique et l’analyse de pannes, notamment pour les systèmes existants et les incidents difficiles à reproduire.
Liens publics