web-dev-qa-db-fra.com

Encodage de fichier par lots

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 que si je mets 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.

La même chose est vraie pour la sortie de commande. Si je dir 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 dire à cmd.exe comment interpréter ce qui apparaît comme un é dans mon fichier batch, est-ce vraiment un é et non un Ú ou une virgule?

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

50
shodanex

Vous devez enregistrer le fichier de commandes avec l'encodage OEM. Comment faire cela varie en fonction de votre éditeur de texte. Le codage utilisé dans ce cas varie également. Pour les cultures occidentales, il s'agit généralement de CP850.

Les fichiers batch et l'encodage sont deux choses qui ne s'aiment pas particulièrement. Vous remarquerez que l’unicode est également impossible à utiliser là-bas, malheureusement (même si les variables d’environnement le gèrent très bien).

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

chcp 1252

devrait faire l'affaire. Au moins cela a fonctionné pour moi ici.

Lorsque vous effectuez 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 commutateur /u sur cmd.exe pour forcer la redirection de sortie Unicode, ce qui a pour conséquence que les fichiers résultants sont au format UTF-16.

En ce qui concerne les encodages et les pages de code dans cmd.exe en général, voyez également cette question:

EDIT: En ce qui concerne votre modification: Non, cmd suppose toujours que le fichier de traitement par lots est écrit dans la page de codes par défaut de la console. Cependant, vous pouvez facilement inclure une 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 souhaiterez peut-être 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
65
Joey

J'avais des problèmes avec cela, et voici la solution que j'ai trouvée. Recherchez le nombre 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 en 248 (U + 00F8) est.

Si vous insérez le caractère Unicode dans votre script batch, il s'affichera sur la console sous la forme du caractère souhaité.

Donc mon fichier batch

echo

empreintes

°
1
dconman

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

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
1
David Pontbriand

Je me soucie de trois concepts:

  1. Codage de la console de sortie

  2. Encodage interne en ligne de commande (modifié avec chcp)

  3. Encodage de texte .bat

Le scénario le plus simple pour moi: les deux premiers seront mentionnés dans le même encodage, disons CP850, et je stockerai mon .bat dans le même encodage (dans Notepad ++, menu Encodage Jeux de caractères Europe occidentale OEM 850 ).

Mais supposons que quelqu'un me passe un .bat dans un autre encodage, par exemple CP1252 (dans Notepad ++, menu Encoding * → Jeux de caractères Europe occidentale Windows-1252 )

Ensuite, je modifierais le codage interne de la ligne de commande, avec chcp 1252.

Cela modifie le codage utilisé pour communiquer 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 en 1252 via son descripteur de fichier STDOUT, mais le texte gabbed apparaît lorsque la console les décode 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

D'abord, je désactive l'écho pour que les commandes ne sortent que si explicitement echo ... ou Perl -e "print ..."

Ensuite, je mets ce passe-partout à chaque fois que je dois sortir quelque chose

Perl -e "utiliser Encoder qw/encoder decode /;" -e "print encode ('cp850', decode ('cp1252', \" ren -hélice hélice\n\"));"

Je substitue le texte actuel que je vais montrer à ceci: ren -hélice hélice.

Et aussi je pourrais avoir besoin de substituer mon codage de console pour cp850 et un autre codage 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.

  • La première que je fais pour être sûr: le "é" est interprété comme un "é" au moyen de transcodage. Il est nécessaire pour toutes les phrases de sortie car la console et le fichier sont à des encodages différents.

  • La seconde, la commande réelle (avec le paramètre @echo off), sachant que nous avons le même encodage à partir de chcp et du texte .bat suffit à assurer une interprétation correcte des caractères.

1
g.cze

J'avais des signes de polissage à l'intérieur du code dans R (par exemple. ±, ê, ź, ż etc.) et le 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’a pas fonctionné jusqu’à la fin).

Ma solution: 

  1. Enregistrer le script R avec codage: Fichier> Enregistrer avec codage> CP1250
  2. Exécuter le fichier .bat

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

0
michal