utf8 page must cp65001 code windows encoding batch-file cmd

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:

  1. Consola de salida de codificación

  2. Codificación interna de la línea de comando (que cambió con chcp)

  3. .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ónConjuntos de caracteresEuropeo occidentalOEM 850 ).

Pero supongamos que alguien me entrega un .bat en otra codificación, digamos CP1252 (en Notepad ++, menú Codificación * → Conjuntos de caracteresEuropeo occidentalWindows-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:

  1. Guardar secuencia de comandos R con codificación: Archivo> Guardar con codificación> CP1250
  2. Ejecuta el archivo .bat

Me funcionó, pero si todavía existe el problema, intente usar las otras codificaciones.