Pregunta

Tengo un pequeño programa de consola de C # que genera texto mediante Console.WriteLine. Luego canalizo esta salida en un archivo de texto como:

c: myprogram > textfile.txt

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

  

/ U Provoca la salida de interna   comandos a una tubería o archivo para ser Unicode

Y de hecho hace la diferencia, cuando hago un

c: echo " foo " > text.txt

el text.txt es unicode (sin BOM)

Me pregunto por qué canalizar 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?

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

¡Gracias!

¿Fue útil?

Solución

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, sin embargo. Me encontré con este blog de Junfeng Zhang que describe cómo escribir texto Unicode en un programa de consola. Comprueba el tipo de archivo del controlador 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 canalizaciones), 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 eso en términos .Net.

Otros consejos

Observé cómo mscorlib implementa Console.WriteLine, y parece decidir qué codificación de salida de texto usar en función de una llamada a GetConsoleOutPutCP . Así que supongo (pero aún no 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 genera ansi cuando se ejecuta desde cmd.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top