la tubería de cmd de Windows no es unicode incluso con el interruptor / U
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:
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
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!
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.