Codifica dei file batch

Mi piacerebbe occuparmi di nomi di file contenenti caratteri strani, come l’é francese.

Tutto funziona bene nella shell:

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

So che se metto questa riga in un file .bat, ottengo il seguente risultato:

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

Vedi? é stato sostituito da Ú.

Lo stesso vale per l’output di comando. Se dir qualche directory nella shell, l’output va bene. Se reindirizzo questo output a un file, alcuni caratteri vengono trasformati.

Quindi, come posso dire a cmd.exe come interpretare ciò che appare come é nel mio file batch, è davvero un é e non un Ú o una virgola?

Quindi non c’è modo quando si esegue un file .bat per dare un suggerimento sulla codepage in cui è stato scritto?

È necessario salvare il file batch con la codifica OEM. Come farlo varia a seconda del tuo editor di testo. Anche la codifica utilizzata in quel caso varia. Per le culture occidentali è in genere CP850.

I file batch e la codifica sono in realtà due cose che non si apprezzano particolarmente. Sfortunatamente noterete che anche Unicode è imansible da usare lì (anche se le variabili d’ambiente lo gestiscono bene).

In alternativa, puoi impostare la console per utilizzare un’altra tabella codici:

 chcp 1252 

dovrebbe fare il trucco Almeno ha funzionato per me qui.

Quando si esegue il reindirizzamento dell’output, ad esempio con dir , si applicano le stesse regole. La codepage della finestra della console viene utilizzata. È ansible utilizzare l’ /u su cmd.exe per forzare il reindirizzamento dell’output Unicode, che fa sì che i file risultanti siano in UTF-16.

Come per le codifiche e le code page in cmd.exe in generale, vedi anche questa domanda:

  • Quale codifica / tabella codici è cmd.exe usando

EDIT: Come per la tua modifica: No, cmd assume sempre che il file batch sia scritto nella codepage predefinita della console. Tuttavia, puoi facilmente includere un chcp all’inizio del batch:

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

Per renderlo più robusto quando usato direttamente dalla riga di comando, potresti voler memorizzare la vecchia pagina di codice e ripristinarla in seguito:

 @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 

Ho creato il seguente blocco, che ho inserito all’inizio dei miei file 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 

Ho avuto problemi con questo, ed ecco la soluzione che ho trovato. Trova il numero decimale per il personaggio che stai cercando nella tua attuale tabella codici.

Per esempio, sono nella codepage 437 ( chcp ti dice), e voglio un segno di laurea chcp http://en.wikipedia.org/wiki/Code_page_437 mi dice che il segno di laurea è il numero 248.

Quindi trovi il carattere Unicode con lo stesso numero.

Il carattere Unicode a 248 (U + 00F8) è.

Se si inserisce il carattere Unicode nello script batch, verrà visualizzato sulla console come il carattere desiderato.

Quindi il mio file batch

 echo 

stampe

 ° 

Mi interessano tre concetti:

  1. Codifica console di output

  2. Codifica interna della riga di comando (modificata con chcp)

  3. .bat Codifica del testo

Lo scenario più semplice per me: avrò i primi due citati nella stessa codifica, ad esempio CP850, e memorizzerò il mio .bat nella stessa codifica (in Notepad ++, menu CodificaSet di caratteriEuropeo occidentaleOEM 850 ).

Supponiamo che qualcuno mi dia un bat in un’altra codifica, ad esempio CP1252 (in Notepad ++, menu Encoding * → Set di caratteriEuropeo occidentaleWindows-1252 )

Quindi cambierei la codifica interna della riga di comando, con chcp 1252.

Ciò modifica la codifica utilizzata per comunicare con altri processi, né il dispositivo di input né la console di output.

Quindi la mia istanza della riga di comando invierà efficacemente caratteri nel 1252 attraverso il suo descrittore di file STDOUT, ma il testo scritto appare quando la console li decodifica come 850 (é is Ú).

Quindi modifico il file come segue:

 @echo off perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));" ren -hlice hlice 

Per prima cosa spengo l’eco in modo che i comandi non vengano emessi a meno che non si faccia esplicitamente echo … o perl -e “print …”

Poi metto questo boilerplate ogni volta che ho bisogno di produrre qualcosa

perl -e “usa Codifica qw / codifica decodifica /;” -e “codifica di stampa (‘cp850’, decodifica (‘cp1252’, \” ren -hélice hélice \ n \ “));”

Sostituisco il testo reale che mostrerò per questo: ren-hélice hélice.

Inoltre, potrei aver bisogno di sostituire la codifica della console per cp850 e l’altra codifica laterale per cp1252.

E appena sotto ho messo il comando desiderato.

Ho rotto la linea problematica nella metà di output e la metà di comando reale.

  • Il primo lo posso accertare con certezza: “é” è interpretato come una “é” per mezzo della transcodifica. È necessario per tutte le frasi di output poiché la console e il file sono con codifiche diverse.

  • Il secondo, il comando reale (mormorato con @echo off), sapendo che abbiamo la stessa codifica sia da chcp che dal testo .bat è sufficiente per garantire un’interpretazione corretta dei caratteri.

Avevo i segni lucidi all’interno del codice in R (per esempio ą, ę, ź, ż ecc.) E ho avuto il problema durante l’esecuzione di questo script R con file .bat (nel file di output .Rout invece di quei segni c’erano segni come %, &, # ecc. e il codice non è stato eseguito fino alla fine).

La mia soluzione:

  1. Salva script R con codifica: File> Salva con codifica> CP1250
  2. Esegui il file .bat

Ha funzionato per me, ma se c’è ancora il problema, prova ad usare le altre codifiche.