2010-05-17 30 views
20

Todavía estoy aprendiendo C++, así que tengan paciencia conmigo y mi código descuidado. El compilador que uso es Dev C++. Quiero poder mostrar caracteres Unicode en la consola usando cout. Cuando intento cosas como:salida Unicode para consola con C++, en Windows

#include <iostream> 

int main() 
{ 
    std::cout << "Hello World!\n"; 
    std::cout << "Blah blah blah some gibberish unicode: ĐĄßĞĝ\n"; 
    system("PAUSE"); 
    return 0; 
} 

Emite caracteres extraños a la consola, como μA ■ Gg. ¿Por qué lo hace, y cómo puedo llegar a mostrar ĐĄßĞĝ? ¿O esto no es posible con Windows?

+5

solo un comentario: no use el sistema ("pausa"), es una muy mala práctica. puedes usar cin en su lugar. http://www.gidnetwork.com/b-61.html – nmuntz

+0

¿Duplicado? http://stackoverflow.com/questions/2492077/output-unicode-strings-in-windows-console-app –

+18

Oh dios, ¿cómo lo hacen las personas? ¿Cómo es que cada novato es atraído magnéticamente por Dev C++? Ese trozo de basura estuvo lleno de errores hace 5 años, ¿y adivina qué?Todavía es hoy, ** porque no se ha mantenido desde entonces **. Hay tantos ** buenos ** compiladores libres e IDEs. ¿Por qué, oh, por qué los principiantes insisten en elegir el único que es una porquería absoluta, carecen de características básicas, nunca funcionó, y está lleno de errores y viene con un compilador prehistórico por defecto? – jalf

Respuesta

15

¿Qué hay de std::wcout?

#include <iostream> 

int main() { 
    std::wcout << L"Hello World!" << std::endl; 
    return 0; 
} 

Esta es la secuencia de salida de caracteres anchos estándar.

Sin embargo, como señaló Adrian, esto no aborda el hecho de cmd, por defecto, no maneja salidas Unicode. Esto puede ser abordado mediante la configuración manual de la consola, como se describe en la respuesta de Adrian:

  • cmd Comenzando con el argumento /u;
  • Calling chcp 65001 para cambiar el formato de salida;
  • Y establecer una fuente Unicode en la consola (como Lucida Console Unicode).

También puede tratar de utilizar _setmode(_fileno(stdout), _O_U16TEXT);, que requieren fcntl.h y io.h (como se describe en this answer y documentado en this blog post).

+0

Esto no soluciona el hecho de que la consola normalmente está en modo ANSI o OEM. –

+1

Esto es correcto, pero ... 'cmd' maneja la salida Unicode por defecto a la consola pero no cuando se redirige a un archivo. Use '/ u' para que también dé salida a Unicode a los archivos redirigidos. En ambos casos "Unicode" significa 'UTF-16' como es habitual en Windows. 'chcp 65001' establece la página de códigos' ANSI' en 'UTF-8' que no se trata con caracteres anchos,' wcout' y 'cmd/u'. ¡No necesita configurar la página de códigos en UTF-8 para generar UTF16! Además, la API 'WriteFile()' está rota bajo 'chcp 65001'. ¡La llamada '_setmode()' es importante y obligatoria si desea generar caracteres más allá de su página de códigos ANSI! – hippietrail

+0

@Adrian: la consola no tiene un modo ANSI u OEM. Tiene una página de códigos ANSI que de forma predeterminada es una página de códigos OEM como 437 u 850. Pero no es necesario que imprima a través de esta página de códigos. Todas las API de texto de Windows tienen una versión "A" y una versión "W". 'A' para ANSI que pasa por la página de códigos,' W' para "ancho" que no pasa por la página de códigos, pero trata directamente en UTF-16 Unicode. Ambos están siempre presentes sin un requisito o incluso una posibilidad de cambiar un "modo". – hippietrail

1

ha utilizado el flujo de salida ANSI. Es necesario utilizar
std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

También, el uso std :: cin.get(), no del sistema ("PAUSE")

+1

Gracias por el consejo sobre cin.get(). Sé usar el sistema ("PAUSA"); es un mal hábito, pero Dev C++ no admite nada más que yo use. Además, wcout no es reconocido por Dev C++. Creo que seguiré los consejos en las otras respuestas/comentarios y cambiaré a Visual Studio. Experimento menos problemas con ese IDE. –

+0

También se debe tener en cuenta que 'system (" PAUSE ")' no es portátil, mientras que 'cin.get()' es. – ptyyy

6

No estoy seguro de Windows XP apoyará plenamente lo que necesita. Hay tres cosas que hay que hacer para permitir a Unicode con una consola de comandos:

  1. iniciar la ventana de comandos con cmd /u. El /u indica que sus programas generarán Unicode.
  2. Uso chcp 65001 para indicar que desea utilizar UTF-8 en lugar de una de las páginas de códigos.
  3. Seleccione una fuente con más cobertura de glifos. Las ventanas de comando en las versiones más nuevas de Windows ofrecen Lucida Console Unicode. Mi cuadro XP tiene un subconjunto llamado Lucida Console. No tiene un repertorio muy extenso, pero debería ser suficiente si solo está tratando de mostrar algunos caracteres acentuados.
+1

+1 para uso chcp 65001 - esto funciona. (desde cmd /?:/U Hace que la salida de comandos internos a una tubería o archivo sea Unicode.) –

+2

1. '/ u' solo significa que los comandos incorporados generarán UTF-16 cuando se redirijan en lugar de ANSI. No significa nada para su propio código o para la salida que no se redirecciona. 2. 'chcp 65001' no funciona correctamente con la salida de la consola UTF-8 debido a un error en la API' WriteFile() 'que hace que devuelva el valor incorrecto. Esta API es llamada por las funciones estándar de la biblioteca C, como 'printf()' y cualquiera de ellas que compruebe que el código de retorno puede fallar o dar como resultado un comportamiento impredecible. 3. El consejo de fuente es correcto y es un error tonto de Windows en mi humilde opinión. – hippietrail

-3

En Linux, que puedo hacer ingenuamente:

std::cout << "ΐ , Α, Β, Γ, Δ, ,Θ , Λ, Ξ, ... ±, ... etc"; 

y ha funcionado para la mayoría de los personajes que he probado.

Cuestiones relacionadas