2010-04-24 26 views
8

Si está realizando una automatización en Windows y está redirigiendo la salida de diferentes comandos (cmd.exe interno o externo, descubrirá que sus archivos de registro contienen salida combinada Unicode y ANSI (lo que significa que no son válidos y no se cargarán bien en Los espectadores/editores).¿Cómo hacer una correcta redirección de salida ANSI y Unicode en cmd.exe?

es que es posible hacer el trabajo cmd.exe con UTF-8? Esta pregunta no es sobre la pantalla, está sobre el stdin/stdout/stderr redirección y Unicode.

soy buscando una solución que le permita:

  • redirigir la salida de los comandos internos a un archivo usando UTF-8
  • redirigir la salida de comandos externos que soportan Unicode a los archivos pero codificados como UTF-8.

Si no es posible obtener este tipo de consistencia utilizando archivos de proceso por lotes, ¿hay alguna otra manera de resolver este problema, como usar scripts de python para esto? En este caso, me gustaría saber si es posible hacer la detección de Unicode solo (el usuario que utiliza la secuencia de comandos no debe recordar si las herramientas solicitadas generarán Unicode o no, solo esperará convertir la salida a UTF-8.

Por simplicidad asumiremos que si la salida de la herramienta no es Unicode, se considerará como UTF-8 (sin conversión de página de códigos).

Respuesta

8

Usted puede utilizar chcp para cambiar la página de códigos activa. Esta voluntad ser utilizado para redireccionar el texto así:

chcp 65001 

tenga en cuenta, sin embargo, que esto no tendrá ningún efecto si cmd se inició con el interruptor /u que fuerza la salida de redirección Unicode (UTF-16 en este caso). Si ese conmutador está activo, todos los resultados estarán en UTF-16LE, independientemente de la página de códigos configurada con chcp.

También tenga en cuenta que la consola no se podrá utilizar para la salida interactiva cuando se configure en Fuentes de trama. Estoy recibiendo mensajes de error de diversión en ese caso:

C:\Users\Johannes Rössel\Documents>x 
Active code page: 65001 

The system cannot write to the specified device. 

Así que, o utilizar una configuración cuerdo (fuente TrueType para la consola) o no tire este truco cuando se utiliza la consola de forma interactiva y con una ruta que contiene no -caracteres ASCII.

+0

Si investiga un poco más, encontrará que la página de códigos UTF-8 no es compatible con Windows, en ninguna versión. Entonces 'chcp 65001' no tiene sentido. – sorin

+0

@Sorin: Funciona, pero no de manera confiable ni compatible. Si tiene archivos de lotes codificados en UTF para ejecutar (sin la lista de materiales) puede hacerlo con esto. – Joey

+0

Hay un error importante en el uso de UTF-8 como página de códigos ANSI en que la API 'WriteFile()' devuelve el número de puntos de escritura escritos en lugar de la cantidad de bytes escritos, que es lo que está documentado. Esta API es llamada en última instancia por la mayoría de las funciones de la biblioteca C, como 'printf()' y por la mayoría de los lenguajes de scripting, incluidos Perl, PHP y Ruby.Cualquier código que verifique que una escritura fue exitosa al comparar el número de bytes enviados y la cantidad de bytes devueltos fallará. El código que usa el número devuelto para mover el cursor de salida dará como resultado un texto ilegible al imprimir texto que no sea ASCII. – hippietrail

0
binmode(STDOUT, ":unix"); 

sin

use encoding 'utf8'; 

me ayudó. Con eso tuve un amplio personaje en la advertencia de impresión.

Cuestiones relacionadas