Trois concepts m'intéressent :
-
Encodage de la console de sortie
-
Encodage interne de la ligne de commande (qui a changé avec chcp)
-
Encodage du texte .bat
Le scénario le plus simple pour moi : Je vais avoir les deux premiers mentionnés dans le même encodage, disons CP850, et je vais stocker mon .bat dans ce même encodage (dans Notepad++, menu Encodage → Jeux de caractères → Europe occidentale → OEM 850 ).
Mais supposons que quelqu'un me remette un .bat dans un autre encodage, disons CP1252 (dans Notepad++, menu Encodage* → Jeux de caractères → Europe occidentale → Windows-1252 )
Ensuite, je changerais l'encodage interne de la ligne de commande, avec chcp 1252.
Cela change le codage qu'il utilise pour parler avec d'autres processus, ni le périphérique d'entrée ni la console de sortie.
Ainsi, mon instance de ligne de commande enverra effectivement des caractères en 1252 par l'intermédiaire de son descripteur de fichier STDOUT, mais du texte tronqué apparaîtra lorsque la console les décodera en 850 (é est Ú).
Ensuite, je modifie le fichier comme suit :
@echo off
perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));"
ren -hlice hlice
Tout d'abord, j'ai désactivé echo pour que les commandes ne soient pas affichées à moins de faire explicitement echo... ou perl -e "print...".
Ensuite, je mets ce texte passe-partout chaque fois que j'ai besoin de sortir quelque chose
perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hélice hélice \n\ ")) ;"
Je substitue à cela le texte que je vais montrer : ren -hélice hélice.
Et aussi je pourrais avoir besoin de remplacer l'encodage de ma console par cp850 et l'encodage de l'autre côté par cp1252.
Et juste en dessous, je mets la commande souhaitée.
J'ai séparé la ligne problématique en deux parties : la moitié de la sortie et la moitié de la commande réelle.
-
La première est certaine : le "é" est interprété comme un "é" au moyen d'un transcodage. C'est nécessaire pour toutes les phrases de sortie puisque la console et le fichier ont des encodages différents.
-
La seconde, la vraie commande (murmurée avec @echo off), sachant que nous avons le même encodage à partir de chcp et du texte .bat est suffisante pour assurer une interprétation correcte des caractères.