windows - page - cmd utf8 encoding
Codificación de archivo por lotes (5)
Creé el siguiente bloque, que puse al principio de mis archivos por lotes:
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
Me gustaría tratar con un nombre de archivo que contenga caracteres extraños, como el é.
Todo funciona bien en el caparazón:
C:/somedir/>ren -hélice hélice
Sé que si coloco esta línea en un archivo .bat, obtengo el siguiente resultado:
C:/somedir/>ren -hÚlice hÚlice
Ver ? é ha sido reemplazado por Ú.
Lo mismo es cierto para la salida de comando. Si dirijo algún directorio en el shell, la salida está bien. Si redirijo esta salida a un archivo, algunos caracteres se transforman.
Entonces, ¿cómo puedo decirle a cmd.exe cómo interpretar lo que aparece como un é en mi archivo por lotes, es realmente un é y no un Ú o una coma?
Entonces, ¿no hay forma de ejecutar un archivo .bat para dar una pista sobre la página de códigos en la que se escribió?
Debe guardar el archivo por lotes con codificación OEM. Cómo hacer esto varía según su editor de texto. La codificación utilizada en ese caso también varía. Para las culturas occidentales, generalmente es CP850.
Los archivos por lotes y la codificación son en realidad dos cosas que no se gustan entre sí. Notarás que Unicode también es imposible de usar allí, desafortunadamente (aunque las variables de entorno lo manejen bien).
Alternativamente, puede configurar la consola para usar otra página de códigos:
chcp 1252
debería hacer el truco. Al menos funcionó para mí aquí.
Cuando realiza la redirección de salida, como con dir
, se aplican las mismas reglas. Se utiliza la página de códigos de la ventana de la consola. Puede usar el /u
en cmd.exe
para forzar la redirección de salida Unicode, lo que hace que los archivos resultantes estén en UTF-16.
En cuanto a las codificaciones y páginas de códigos en cmd.exe
en general, también vea esta pregunta:
EDITAR: En cuanto a su edición: No, cmd
siempre asume que el archivo por lotes se escribirá en la página de códigos predeterminada de la consola. Sin embargo, puede incluir fácilmente un chcp
al comienzo del lote:
chcp 1252>NUL
ren -hélice hélice
Para hacer esto más robusto cuando se usa directamente desde la línea de comandos, es posible que desee memorizar la página de códigos anterior y restaurarla después:
@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
Estaba teniendo problemas con esto, y aquí está la solución que encontré. Encuentra el número decimal para el personaje que estás buscando en tu página de códigos actual.
Por ejemplo, estoy en la página de códigos 437 (dice chcp
), y quiero un signo de grado chcp
http://en.wikipedia.org/wiki/Code_page_437 me dice que el signo de grado es el número 248.
Luego encuentras el carácter Unicode con el mismo número.
El carácter Unicode en 248 (U + 00F8) es.
Si inserta el carácter Unicode en su secuencia de comandos por lotes, se mostrará en la consola como el carácter que desee.
Entonces mi archivo por lotes
echo
huellas dactilares
°
Me importan tres conceptos:
Consola de salida de codificación
Codificación interna de la línea de comando (que cambió con chcp)
.bat Codificación de texto
El escenario más fácil para mí: tendré los dos primeros mencionados en la misma codificación, digamos CP850, y almacenaré mi .bat en esa misma codificación (en Notepad ++, menú Codificación → Conjuntos de caracteres → Europeo occidental → OEM 850 ).
Pero supongamos que alguien me entrega un .bat en otra codificación, digamos CP1252 (en Notepad ++, menú Codificación * → Conjuntos de caracteres → Europeo occidental → Windows-1252 )
Luego cambiaría la codificación interna de la línea de comando, con chcp 1252.
Esto cambia la codificación que usa para hablar con otros procesos, ni el dispositivo de entrada ni la consola de salida.
Por lo tanto, mi instancia de línea de comandos efectivamente enviará caracteres en 1252 a través de su descriptor de archivo STDOUT, pero el texto agrupado aparece cuando la consola los decodifica como 850 (é es Ú).
Luego modifico el archivo de la siguiente manera:
@echo off
perl -e "use Encode qw/encode decode/;" -e "print encode(''cp850'', decode(''cp1252'', /"ren -hlice hlice/n/"));"
ren -hlice hlice
Primero apago el eco para que los comandos no salgan a menos que haga explícitamente echo ... o perl -e "print ..."
Luego puse esta repetición cada vez que necesito sacar algo
perl -e "use Encode qw / encode decode /;" -e "print encode (''cp850'', decode (''cp1252'', /" ren -hélice hélice / n / "));"
Sustituyo el texto real que mostraré para esto: ren -hélice hélice.
Y también podría necesitar sustituir la codificación de mi consola por cp850 y otra codificación lateral por cp1252.
Y justo debajo pongo el comando deseado.
Rompí la línea problemática en la mitad de salida y la mitad del comando real.
Lo primero que aseguro: la "é" se interpreta como una "é" mediante la transcodificación. Es necesario para todas las oraciones de salida ya que la consola y el archivo están en diferentes codificaciones.
El segundo, el comando real (murmurado con @echo off), sabiendo que tenemos la misma codificación tanto de chcp como del texto .bat es suficiente para asegurar una interpretación adecuada del carácter.
Tenía signos de pulido dentro del código en R (por ejemplo, ±, ę, ź, ż etc.) y tuve el problema al ejecutar este script R con el archivo .bat (en el archivo de salida .Rout en lugar de esos signos había signos como %, &, # etc. y el código no se ejecutó hasta el final).
Mi solución:
- Guardar secuencia de comandos R con codificación: Archivo> Guardar con codificación> CP1250
- Ejecuta el archivo .bat
Me funcionó, pero si todavía existe el problema, intente usar las otras codificaciones.