Para una aplicación de consola C++ compilada 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?Cómo imprimo UTF-8 desde la aplicación de consola C++ en Windows
Respuesta
En la consola, ingrese chcp 65001
para cambiar la página de códigos a la de UTF-8.
La consola de Windows usa el OEM code page de forma predeterminada para mostrar la salida.
Para cambiar la página de códigos Unicode a entrar chcp 65001
en la consola, o tratar de cambiar la página de códigos mediante programación con SetConsoleOutputCP
.
Tenga en cuenta que probablemente tenga que cambiar la fuente de la consola a una que tenga glifos en el rango Unicode.
Tenga en cuenta que hay muchos errores con UTF-8 como página de códigos. La mayoría son WONTFIX. – Deduplicator
Nunca he intentado 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 varios bytes), pero hay un par de funciones para buscar: SetConsoleCP y SetConsoleOutputCP.
Probablemente también deba asegurarse de estar utilizando una fuente de consola que sea capaz de mostrar sus caracteres. Está la función SetCurrentConsoleFontEx, pero solo está disponible en Vista y más arriba.
Espero que ayude.
Pruebe la fuente Lucida Console. – anno
Here's an article from MVP Michael Kaplan cómo salir correctamente de UTF-16 a través de la consola. Puede convertir su UTF-8 a UTF-16 y generarlo.
Una observación: Michael Kaplan no es un MVP. No sé si alguna vez lo fue. Ha sido empleado de Microsoft por mucho tiempo (los empleados de Microsoft no son elegibles para el programa MVP). –
Este enlace trae a _Resource Not Found_. – Salvador
A partir del 2016-08-09, el enlace redirecciona a http://archives.miloush.net/michkap/archive/2008/03/18/8306597.html pero hay material presente (presumiblemente lo que originalmente estaba en siao2.com) –
Consola de inicio de aplicación establecida 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 usted.
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))
{
}
}
}
Esto debería funcionar:
#include <cstdio>
#include <windows.h>
#pragma execution_character_set("utf-8")
int main()
{
SetConsoleOutputCP(65001);
printf("Testing unicode -- English -- Ελληνικά -- Español -- Русский. aäbcdefghijklmnoöpqrsßtuüvwxyz\n");
}
No sabe si afecta a nada, pero el archivo de origen se guarda como Unicode (UTF-8 con firma) - Página de códigos 65001 en ARCHIVO ->Opciones de guardado avanzadas ....
Proyecto -> Propiedades -> Propiedades de configuración ->general ->juego de caracteres se establece en Unicode Uso de conjuntos de caracteres.
Algunos dicen que necesita para cambiar la fuente de la consola para Lucida Console, pero de mi parte que se muestra con tanto Consolas y Lucida Console.
Usando el código página 1252 (latín 1), esto funciona. – someonewithpc
Sólo para información adicional:
'ANSI' se refiere a las ventanas-125x, que se utiliza para aplicaciones Win32, mientras que 'OEM' se refiere a la página de códigos utilizada por aplicaciones/MS-DOS consola.
Las páginas de códigos activos actuales se pueden recuperar con las funciones GetOEMCP() y GetACP().
Con el fin de demostrar algo correctamente a la consola, debe:
garantizar la página actual de códigos OEM compatible con los caracteres que desee a la salida
(si es necesario, utilizar SetConsoleOutputCP para configurarlo adecuadamente)convertir la cadena de código ANSI actual (Win32) a la página de códigos OEM consola
Estas son 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;
}
- 1. Windows desde la consola
- 2. Comandos de Windows Forms + desde la consola en C#
- 3. Ejecutar aplicación de consola desde otra aplicación de consola
- 4. Grails: ¿Cómo imprimo en la consola del cmd?
- 5. ¿Cómo imprimo desde Emacs en Win32?
- 6. Obteniendo python para imprimir en UTF8 en Windows XP con la consola
- 7. ¿Cómo ejecutar la aplicación de consola desde el servicio de Windows?
- 8. escrito a C++ aplicación de consola dio lugar a la aplicación Dentro de Java en Windows
- 9. Abra web.config desde la aplicación de consola?
- 10. Colorear salida stdout a Windows cmd.exe desde la consola C++ aplicación
- 11. lectura Unicode desde la consola
- 12. Cómo mostrar UTF-8 en la consola de Windows
- 13. cómo ejecutar la aplicación de consola desde el formulario de Windows?
- 14. Cómo dar salida a la consola en C++/Windows
- 15. Archivo App.Config en la aplicación de consola C#
- 16. Diferencia entre Windows y la aplicación de consola
- 17. ¿Es posible utilizar HttpBrowserCapabilities desde una aplicación de consola C#?
- 18. Redirecciona console.writeline desde la aplicación de Windows a una cadena
- 19. Salida de la consola de captura C# en Windows 7
- 20. ¿Cómo leer una línea desde la consola en C?
- 21. C#. Cómo seleccionar programáticamente y copiar texto desde la aplicación de la consola?
- 22. lectura carbón desde la consola
- 23. UTF8 a/desde conversión de ancho de pila en STL
- 24. Tamaño predeterminado de Windows para la aplicación de consola
- 25. Mostrar/Ocultar la ventana de la consola de una aplicación de consola C#
- 26. ¿Cómo construyo una aplicación de consola VB6?
- 27. ¿Cómo imprimo la propiedad de un objeto a la consola del depurador en Xcode?
- 28. C# cómo llamar al método de acción MVC desde la aplicación de consola
- 29. Ocultar la ventana de la consola desde Process.Start C#
- 30. Procesamiento UTF8 en C
Hay un hilo interesante en cplusplus.com: UTF-8 en línea de comandos (consola) http://www.cplusplus.com/forum/windows/9797/ – anno
** Recién llegados: ** [Verifique mi respuesta aquí] (http://stackoverflow.com/a/40337240/3258851) sobre el uso de Unicode - y marque [esta respuesta] (http://stackoverflow.com/a/26479960/ 3258851) al cambiar la fuente de la consola. –