es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo prevenir que los fragmentos de texto de colores en la línea de comandos se vuelvan blancos al utilizar std::wcout.

Recientemente volví a usar C++ y esto está más allá de mí. Esta aplicación de línea de comandos, cuando se compila usando el depurador en VS2022, se ve perfectamente como debería. Sin embargo, cuando ejecuto el archivo ejecutable del proyecto compilado, un fragmento de texto aparentemente al azar a menudo cambia su color al blanco predeterminado.

Obviamente, no es perceptible cuando ocurre con texto blanco, pero tengo la intención de usar SetConsoleTextAttribute (o cualquier otra forma de imprimir texto de colores) en mi programa, así como el soporte Unicode, que _getline hace perfectamente.

Parece que se debe a wcout, ya que eliminar _setline y cambiarlos de nuevo al tipo estrecho solucionó el problema. Sin embargo, simplemente eliminar _setline no hace nada.

Código:

“`cpp

#include <iostream>
#include <fcntl.h>
#include <windows.h>
#include <io.h>

using namespace std;

int main() {

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

fflush(stdout);
(void)_setmode(_fileno(stdout), _O_U16TEXT);

SetConsoleTextAttribute(hConsole, 10);

wcout << L"Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n";
wcout << L"sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n";

SetConsoleTextAttribute(hConsole, 11);

wcout << L"Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n";
wcout << L"sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n";

SetConsoleTextAttribute(hConsole, 12);

wcout << L"Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n";
wcout << L"sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n";

cin.get();

}
“`</io.h></windows.h></fcntl.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema ocurre al utilizar wcout y la función _setmode para establecer el modo de salida en Unicode. Una posible solución sería utilizar SetConsoleOutputCP en lugar de _setmode para establecer la página de códigos de salida de la consola en Unicode. Esto se puede hacer agregando la siguiente línea de código antes de llamar a SetConsoleTextAttribute:

    SetConsoleOutputCP(CP_UTF8);
    

    Esto establece la página de códigos de salida de la consola en UTF-8, que admite caracteres Unicode. Además, asegúrese de que la fuente de la consola admita los caracteres Unicode que se van a imprimir.

    Otra posible solución sería utilizar una biblioteca que maneje la salida en la consola y el texto Unicode, como Boost o PDCurses. Esto puede simplificar el código y proporcionar un mejor soporte para la salida de texto Unicode.

Comments are closed.