¿Cómo imprimo UTF-8 desde la aplicación de consola c ++ en Windows

Para una aplicación de consola C ++ comstackda con Visual Studio 2008 en inglés Windows (XP, Vista o 7). ¿Es posible imprimir en la consola y mostrar correctamente el japonés codificado en UTF-8 usando cout o wcout?

La consola de Windows usa la página de códigos OEM por defecto para mostrar la salida.

Para cambiar la página de códigos a Unicode, ingrese chcp 65001 en la consola o intente cambiar la página de códigos mediante SetConsoleOutputCP .

Tenga en cuenta que probablemente tenga que cambiar la fuente de la consola a una que tenga glifos en el rango Unicode.

Aquí hay un artículo de MVP Michael Kaplan sobre cómo sacar correctamente UTF-16 a través de la consola. Puede convertir su UTF-8 a UTF-16 y generarlo.

En realidad nunca intenté configurar la página de códigos de la consola en UTF8 (no estoy seguro de por qué no funcionaría … la consola puede manejar otras páginas de códigos de múltiples bytes), pero hay un par de funciones para ver. arriba: SetConsoleCP y SetConsoleOutputCP.

Probablemente también necesites asegurarte de estar usando una fuente de consola que sea capaz de mostrar tus personajes. Está la función SetCurrentConsoleFontEx , pero solo está disponible en Vista y más arriba.

Espero que ayude.

Esto debería funcionar:

 #include  #include  #pragma execution_character_set( "utf-8" ) int main() { SetConsoleOutputCP( 65001 ); printf( "Testing unicode -- English -- Ελληνικά -- Español -- Русский. aäbcdefghijklmnoöpqrsßtuüvwxyz\n" ); } 

No sé si afecta algo, pero el archivo fuente se guarda como Unicode (UTF-8 con firma) – Página de códigos 65001 en ARCHIVO -> Opciones avanzadas de guardado ….

Proyecto -> Propiedades -> Propiedades de configuración -> General -> Conjunto de caracteres está configurado para Usar conjunto de caracteres Unicode .

Algunos dicen que necesitas cambiar la fuente de la consola a Lucida Console , pero de mi lado se muestra con Consolas y Lucida Console .

En la consola de inicio de la aplicación configurada en CP OEM437 por defecto. Estaba intentando enviar texto Unicode a stdout, donde la consola cambió a la traducción UTF8 _setmode (_fileno (stdout), _O_U8TEXT); y aún no tuvo suerte en la pantalla, incluso con la fuente Lucida TT. Si la consola se redirigió a un archivo, se crearon los archivos UTF8 correctos.

Finalmente tuve suerte. He agregado una sola línea “info.FontFamily = FF_DONTCARE;” y está funcionando ahora. Espero que esta ayuda para ti.

 void SetLucidaFont() { HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_FONT_INFOEX info; memset(&info, 0, sizeof(CONSOLE_FONT_INFOEX)); info.cbSize = sizeof(CONSOLE_FONT_INFOEX); // prevents err=87 below if (GetCurrentConsoleFontEx(StdOut, FALSE, &info)) { info.FontFamily = FF_DONTCARE; info.dwFontSize.X = 0; // leave X as zero info.dwFontSize.Y = 14; info.FontWeight = 400; _tcscpy_s(info.FaceName, L"Lucida Console"); if (SetCurrentConsoleFontEx(StdOut, FALSE, &info)) { } } } 

Solo para obtener información adicional:

‘ANSI’ se refiere a windows-125x, utilizado para aplicaciones win32, mientras que ‘OEM’ se refiere a la página de códigos utilizada por las aplicaciones de consola / MS-DOS.
Las páginas de códigos activas actuales se pueden recuperar con las funciones GetOEMCP () y GetACP ().

Para enviar algo correctamente a la consola, debes:

  1. asegúrese de que la página actual de códigos OEM admita los caracteres que desea imprimir
    (si es necesario, use SetConsoleOutputCP para configurarlo correctamente)

  2. convierta la cadena del código ANSI actual (win32) a la página de códigos OEM de la consola

Aquí hay algunas utilidades para hacerlo:

 // Convert a UTF-16 string (16-bit) to an OEM string (8-bit) #define UNICODEtoOEM(str) WCHARtoCHAR(str, CP_OEMCP) // Convert an OEM string (8-bit) to a UTF-16 string (16-bit) #define OEMtoUNICODE(str) CHARtoWCHAR(str, CP_OEMCP) // Convert an ANSI string (8-bit) to a UTF-16 string (16-bit) #define ANSItoUNICODE(str) CHARtoWCHAR(str, CP_ACP) // Convert a UTF-16 string (16-bit) to an ANSI string (8-bit) #define UNICODEtoANSI(str) WCHARtoCHAR(str, CP_ACP) /* Convert a single/multi-byte string to a UTF-16 string (16-bit). We take advantage of the MultiByteToWideChar function that allows to specify the charset of the input string. */ LPWSTR CHARtoWCHAR(LPSTR str, UINT codePage) { size_t len = strlen(str) + 1; int size_needed = MultiByteToWideChar(codePage, 0, str, len, NULL, 0); LPWSTR wstr = (LPWSTR) LocalAlloc(LPTR, sizeof(WCHAR) * size_needed); MultiByteToWideChar(codePage, 0, str, len, wstr, size_needed); return wstr; } /* Convert a UTF-16 string (16-bit) to a single/multi-byte string. We take advantage of the WideCharToMultiByte function that allows to specify the charset of the output string. */ LPSTR WCHARtoCHAR(LPWSTR wstr, UINT codePage) { size_t len = wcslen(wstr) + 1; int size_needed = WideCharToMultiByte(codePage, 0, wstr, len, NULL, 0, NULL, NULL); LPSTR str = (LPSTR) LocalAlloc(LPTR, sizeof(CHAR) * size_needed ); WideCharToMultiByte(codePage, 0, wstr, len, str, size_needed, NULL, NULL); return str; } 

En la consola, ingrese chcp 65001 para cambiar la página de códigos a la de UTF-8.