El siguiente código muestra un comportamiento inesperado en mi máquina (probado con Visual C++ 2008 SP1 en Windows XP y VS 2012 en Windows 7):UTF-8 salida en la consola de Windows
#include <iostream>
#include "Windows.h"
int main() {
SetConsoleOutputCP(CP_UTF8);
std::cout << "\xc3\xbc";
int fail = std::cout.fail() ? '1': '0';
fputc(fail, stdout);
fputs("\xc3\xbc", stdout);
}
simplemente he realizado con cl /EHsc test.cpp
.
Windows XP: de salida en una ventana de la consola es ü0ü
(traducido a la página de códigos 1252, originalmente muestra alguna línea de dibujo charachters en la página de códigos, tal vez 437 por defecto). Cuando cambio la configuración de la ventana de la consola para utilizar el juego de caracteres "Lucida Console" y ejecutar mi test.exe de nuevo, la salida se cambia a 1ü
, lo que significa
- el carácter
ü
se puede escribir usandofputs
y su codificación UTF-8C3 BC
std::cout
no funciona por cualquier razón- las corrientes
failbit
está fijando después de tratar de escribir el carácter
Windows 7: La salida con Consolas es ��0ü
. Aún más interesante. Los bytes correctos se escriben, probablemente (al menos cuando se redirige el resultado a un archivo) y el estado de la secuencia es correcto, pero los dos bytes se escriben como caracteres separados).
Intenté plantear este problema en "Microsoft Connect" (ver here), pero MS no me ha ayudado mucho. Bien podría mirar here como algo similar se ha pedido antes.
¿Puede reproducir este problema?
¿Qué estoy haciendo mal? ¿No deberían el std::cout
y el fputs
tener el mismo efecto ?
resuelto: (tipo de) Siguiendo la idea de mike.dld he implementado un std::stringbuf
hacer la conversión de UTF-8 a Windows-1252 en sync()
y se sustituye el streambuf de std::cout
con este convertidor (ver mi comentario sobre Mike. respuesta del dld).
he tenido problemas con C++ iostreams antes. hay muchas maldades ocultas que causan problemas. esto no vale una respuesta, pero cuando iostreams te da problemas, usa el stdio de c, lo he tenido muchas veces antes con problemas como este. –
Sí, usar iostreams es más complicado que stdio, incluso hay [libros de texto completos] (http://www.amazon.com/Standard-Iostreams-Locales-Programmers-Reference/dp/0201183951) acerca de esto. Pero iostreams te dan una gran flexibilidad, que estoy usando con mucho gusto. – mkluwe
¿No es un problema de la consola de Windows? Recuerdo que no es unicode consciente de ninguna manera, creando muchos de esos problemas ... –