2008-11-12 25 views
5

Tengo un pequeño programa de consola C# que genera texto utilizando Console.WriteLine. entonces tubería esta salida en un archivo de texto como:ventanas cmd tubería no unicode incluso con el modificador/U

c:myprogram > textfile.txt

Sin embargo, el archivo es siempre un archivo de texto ANSI, incluso cuando comienzo cmd con el modificador/u. cmd /? dice acerca del modificador/u:

/T hace que la salida de comandos internos a una tubería o un archivo para ser Unicode

Y de hecho hace la diferencia, cuando hago un

c:echo "foo" > text.txt

la text.txt es unicode (sin BOM)

me pregunto por qué tubería de la salida de ¿Mi programa de consola en un nuevo archivo no crea un archivo Unicode de la misma manera y cómo podría cambiar eso?

Acabo de utilizar Windows Power Shell (que produce un archivo Unicode con la lista de materiales correcta), pero me gustaría saber cómo hacerlo con cmd.

Gracias!

Respuesta

6

El modificador/U, como dice la documentación, afecta si los comandos internos generan salida Unicode. Su programa no es uno de los comandos internos de cmd.exe, por lo que la opción/U no lo afecta.

Para crear un archivo de texto Unicode, debe asegurarse de que su programa esté generando texto Unicode.

Incluso eso puede no ser suficiente. Me encontré con this blog from Junfeng Zhang que describe cómo escribir texto Unicode en un programa de consola. Comprueba el tipo de archivo del identificador de salida estándar. Para archivos de caracteres (una consola o puerto LPT), llama a WriteFileW. Para todos los demás tipos de identificadores (incluidos los archivos de disco y las tuberías), convierte la cadena de salida en la página de códigos actual de la consola. Sin embargo, me temo que no sé cómo se traduce en términos .Net.

2

Eché un vistazo cómo mscorlib implementa Console.WriteLine, y parece decidir qué codificación de salida de texto usar en función de una llamada al GetConsoleOutPutCP. Así que supongo (pero aún no lo he confirmado) que la página de códigos devuelta es diferente para una consola PS que para una consola cmd, de modo que mi programa solo emite ansi cuando se ejecuta desde cmd.

+0

Sí, creo que estás haciendo algo con eso. –

+0

La página de códigos de la consola está establecida por 'SetConsoleOutputCP'. Puede configurarlo en lo que desee: PS lo configura en Unicode, y puede hacer lo mismo si lo desea utilizando P/Invoke. – Ben

Cuestiones relacionadas