61 votes

Codage des fichiers par lots

Je voudrais traiter les noms de fichiers contenant des caractères étranges, comme le é français.

Tout fonctionne bien dans le shell :

C:\somedir\>ren -hélice hélice

Je sais que si je place cette ligne dans un fichier .bat, j'obtiens le résultat suivant :

C:\somedir\>ren -hÚlice hÚlice

Voir ? é ont été remplacés par Ú.

Il en va de même pour la sortie des commandes. Si je dir un répertoire dans le shell, la sortie est bonne. Si je redirige cette sortie vers un fichier, certains caractères sont transformés.

Alors comment puis-je dire à cmd.exe comment interpréter ce qui apparaît comme un é dans mon fichier batch, est vraiment un é et non un Ú ou une virgule ?

Il n'y a donc aucun moyen, lors de l'exécution d'un fichier .bat, de donner une indication sur la page de code dans laquelle il a été écrit ?

85voto

Joey Points 148544

Vous devez enregistrer le fichier batch avec l'encodage OEM. La façon de procéder varie en fonction de votre éditeur de texte. L'encodage utilisé dans ce cas varie également. Pour les cultures occidentales, il s'agit généralement du CP850.

Les fichiers batch et l'encodage sont vraiment deux choses qui ne s'apprécient pas particulièrement. Vous remarquerez qu'il est également impossible d'utiliser Unicode à cet endroit, malheureusement (même si les variables d'environnement le gèrent bien).

Vous pouvez également configurer la console pour qu'elle utilise une autre page de code :

chcp 1252

devrait faire l'affaire. En tout cas, ça a marché pour moi ici.

Lorsque vous faites une redirection de sortie, comme avec dir les mêmes règles s'appliquent. La page de code de la fenêtre de la console est utilisée. Vous pouvez utiliser le /u passer à cmd.exe pour forcer la redirection de la sortie Unicode, ce qui fait que les fichiers résultants seront en UTF-16.

Quant aux codages et aux pages de codes dans cmd.exe en général, voir aussi cette question :

EDIT : Quant à votre édition : Non, cmd suppose toujours que le fichier batch est écrit dans la page de code par défaut de la console. Cependant, vous pouvez facilement inclure un chcp au début du lot :

chcp 1252>NUL
ren -hélice hélice

Pour rendre cette fonction plus robuste lorsqu'elle est utilisée directement depuis la ligne de commande, vous pouvez mémoriser l'ancienne page de code et la restaurer par la suite :

@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
ren -hélice hélice
chcp %cp%>nul

1 votes

Chcp fonctionne dans le .bat, même si l'écho est erroné. Cependant, si je fais chcp 1252 dans la console, et que je tape ensuite test.bat, c'est toujours faux...

1 votes

Bien sûr que c'est faux. type ne sait rien de la page de code, il suppose donc celle que vous avez actuellement définie. Ce que chcp dans le lot fait est en changeant cette page de code, d'où les résultats différents. De toute façon, j'ai présenté cela plutôt comme une solution de rechange. La solution correcte consiste à enregistrer le fichier batch dans le codage correct.

0 votes

En fait, l'"entrée" de caractères et la "sortie" de caractères à l'écran sont deux choses différentes. Si je change la police de la console : chcp 850 suivi de type me donne hÛlice chcp 1252 suivi de type me donne hélice Il semble que la police par défaut de la console ne soit pas modifiée par chcp.

2voto

dconman Points 1

J'avais des problèmes avec ça, et voici la solution que j'ai trouvée. Trouvez le numéro décimal du caractère que vous recherchez dans votre page de code actuelle.

Par exemple, je suis dans la page de code 437 ( chcp vous dit), et je veux un signe de degré, . http://en.wikipedia.org/wiki/Code_page_437 me dit que le signe du degré est le numéro 248.

Ensuite, vous trouvez le caractère Unicode avec le même numéro.

Le caractère Unicode à 248 (U+00F8) est .

Si vous insérez le caractère Unicode dans votre script de lot, il s'affichera à la console comme le caractère que vous désirez.

Donc mon fichier batch

echo

imprime

°

1voto

g.cze Points 36

Trois concepts m'intéressent :

  1. Encodage de la console de sortie

  2. Encodage interne de la ligne de commande (qui a changé avec chcp)

  3. 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 EncodageJeux de caractèresEurope occidentaleOEM 850 ).

Mais supposons que quelqu'un me remette un .bat dans un autre encodage, disons CP1252 (dans Notepad++, menu Encodage* → Jeux de caractèresEurope occidentaleWindows-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.

1voto

michal Points 11

J'avais des signes polonais à l'intérieur du code dans R (par exemple, ą, ę, ź, ż etc. problème lors de l'exécution de ce script R avec le fichier .bat (dans le fichier de sortie .Rout, à la place de ces signes, il y avait des signes comme %, &, # etc. et le code n'allait pas jusqu'au bout).

Ma solution :

  1. Enregistrer le script de R avec l'encodage : Fichier > Enregistrer avec l'encodage > CP1250
  2. Exécuter le fichier .bat

Cela a fonctionné pour moi mais si le problème persiste, essayez d'utiliser les autres encodages.

1voto

J'ai créé le bloc suivant, que je place au début de mes fichiers batch :

set Filename=%0
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END
    rem Converting code page from 1252 to 850.
    rem My editors use 1252, my batch uses 850.
    rem We create a converted -850.bat file, and then launch it.
    set File850=%~n0-850.bat
    PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%"
    call %File850%
    del %File850%
    EXIT /b 0
:CONVERT_CODEPAGE_END

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X