Entonces, el siguiente código:

#include <iostream>
#include <string>
#include <io.h>
#include <fcntl.h>
#include <codecvt>

int main()
{
    setlocale(LC_ALL, "");

    std::wstring a;
    std::wcout << L"Type a string: " << std::endl;
    std::getline(std::wcin, a);
    std::wcout << a << std::endl;
    getchar();
}

Cuando escribo "åäö" obtengo un resultado extraño. El cursor de la terminal tiene sangría, pero no hay texto detrás. Si utilizo mi tecla de flecha derecha para mover el cursor hacia adelante, las "åäö" se revelan cuando hago clic en la tecla de flecha derecha.

Si incluyo letras en inglés para que la entrada sea "helloåäö", la salida sea "hola", pero cuando hago clic en la tecla de flecha derecha, aparece "holaääö" letra por letra.

¿Por qué sucede esto y, lo que es más importante, cómo puedo solucionarlo?

Editar: compilo con el compilador de Visual Studio en Windows. Cuando probé este código exacto en repl.it (usan clang), funciona como un encanto. ¿El problema es causado por mi código, Windows o Visual Studio?

0
Elton Stålspets 20 ene. 2021 a las 16:44

1 respuesta

La mejor respuesta

Windows requiere algunas llamadas específicas del sistema operativo para configurar la consola para Unicode:

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

int main()
{
    _setmode(_fileno(stdout),  _O_U16TEXT);
    _setmode(_fileno(stdin), _O_WTEXT);

    std::wstring a;
    std::wcout << L"Type a string: ";
    std::getline(std::wcin, a);
    std::wcout << a << std::endl;
    getwchar();
}

Salida:

Type a string: helloåäö马克
helloåäö马克

1
Mark Tolonen 20 ene. 2021 a las 19:59