Codage de fichier Batch
Je voudrais traiter avec le nom de fichier contenant des caractères étranges, comme le français é.
Tout fonctionne bien dans le shell:
C:somedir>ren -hélice hélice
Je sais si je mets cette ligne dans un .fichier bat, j'obtiens le résultat suivant:
C:somedir>ren -hÚlice hÚlice
Tu vois ? é ont été remplacés par Ú.
La même chose est vraie pour la sortie de commande. Si je {[2] } un répertoire dans le shell, la sortie est correcte. Si je redirige cette sortie vers un fichier, certains caractères sont transformés.
Alors, comment puis-je savoir cmd.exe comment interpréter ce qui apparaît comme un é dans mon fichier batch, est vraiment un é et non un Ú ou une virgule?
, Donc il n'y a aucun moyen lors de l'exécution d'un .fichier bat pour donner un indice sur la page de code dans laquelle il a été écrit?
5 réponses
Vous devez enregistrer le fichier batch avec l'encodage OEM. Comment faire cela varie en fonction de votre éditeur de texte. L'encodage utilisé dans ce cas varie également. Pour les cultures occidentales, C'est généralement CP850.
Les fichiers Batch et l'encodage sont vraiment deux choses qui ne s'aiment pas particulièrement. Vous remarquerez qu'Unicode est également impossible à utiliser là-bas, malheureusement (même si les variables d'environnement le gèrent bien).
Vous pouvez également configurer la console pour qu'elle en utilise une autre page de code:
chcp 1252
Devrait faire l'affaire. Au moins, il a travaillé pour moi ici.
Lorsque vous effectuez une redirection de sortie, par exemple 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 commutateur /u
sur cmd.exe
pour forcer la redirection de sortie Unicode, ce qui fait que les fichiers résultants sont en UTF-16.
En ce qui concerne les encodages et les pages de code dans cmd.exe
en général, voir aussi cette question:
EDIT: quant à votre edit: No, cmd
suppose toujours que le fichier batch doit être é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 cela plus robuste lorsqu'il est utilisé directement à partir de la ligne de commande, vous pouvez mémoriser l'ancienne page de code et la restaurer ensuite:
@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
J'ai créé le bloc suivant, que je mets 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
J'avais des problèmes avec cela, et voici la solution que j'ai trouvée. Trouvez le nombre décimal pour le 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 de degré est le numéro 248.
Ensuite, vous trouvez le caractère Unicode avec le même nombre.
Le caractère Unicode à 248 (U+00F8) est .
Si vous insérez le caractère Unicode dans votre script batch, il affichera à la console comme le caractère que vous désirez.
, Donc mon fichier batch
echo
Imprime
°
Je me soucie de trois concepts:
-
Encodage De La Console De Sortie
-
Encodage interne en ligne de commande (qui a changé avec chcp)
-
.code de texte bat
Le scénario le plus facile pour moi: je vais avoir les deux premiers mentionnés dans le même encodage, disons CP850, et je vais stocker mon .chauve-souris dans le même encodage (dans Notepad++, menu Codage → les jeux de Caractères → de l'europe Occidentale → OEM 850).
, Mais supposons que quelqu'un me tend un .bat dans un autre encodage, disons CP1252 (dans Notepad++, menu Encoding * → Jeux de caractères → Europe occidentale → fenêtres-1252)
Ensuite, je changerais l'encodage interne de la ligne de commande, avec chcp 1252.
Cela change l'encodage qu'il utilise pour parler avec d'autres processus, ni le périphérique d'entrée ni la console de sortie.
Donc, mon instance de ligne de commande enverra effectivement des caractères dans 1252 grâce à son descripteur de fichier STDOUT, mais le texte gabbed apparaît lorsque la console les décode comme 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
D'abord, j'éteins echo afin que les commandes ne sortent pas à moins de faire explicitement l'un ou l'autre écho... ou perl-e "imprimer..."
Ensuite, je mets ce passe-partout chaque fois que j'ai besoin de sortir quelque chose
Perl-e "utiliser Encode QW / encode decode/; "- e " print encode ('cp850', decode ('cp1252', \ " Ren-hélice hélice\n\")); "
Je remplacez le texte actuel que je vais montrer pour cela: Ren-hélice hélice.
Et aussi je pourrais avoir besoin de substituer mon encodage de console pour cp850 et un autre encodage latéral pour cp1252.
Et juste en dessous je mets la commande désirée.
J'ai cassé la ligne problématique dans la moitié de sortie et la moitié de commande réelle.
Le premier que je fais avec certitude: le " é "est interprété comme un" é " au moyen du transcodage. Il est nécessaire pour toutes les phrases de sortie depuis la console et le fichier sont à des encodages différents.
La seconde, la commande réelle (murmuré avec @echo off), sachant que nous avons le même codage à la fois de chcp et le .le texte bat est suffisant pour assurer une interprétation correcte des caractères.
J'avais des signes Polonais à l'intérieur du code dans R (par exemple. ą, ê,¼,½, etc.) et a eu le problème lors de l'exécution de ce script R avec .fichier bat (dans le fichier de sortie .Rout au lieu de ces signes, il y avait des signes comme%,&, # etc. et le code n'a pas fonctionné jusqu'à la fin).
Ma solution:
- Enregistrer le script R avec encodage: Fichier > Enregistrer avec le codage > CP1250
- Cours .fichier bat
Cela a fonctionné pour moi mais s'il y a toujours le problème, essayez d'utiliser l'autre encodage.