是否有正确的方法以 UTF-8 编码从控制台接收输入?

Is there a proper way to receive input from console in UTF-8 encoding?

在 windows 中从 std::cin 获取输入时,输入显然总是采用编码 windows-1252(在我的情况下主机的默认设置)尽管所有配置,显然只影响输出。在 UTF-8 编码中是否有正确的方法来捕获 windows 中的输入?

例如,让我们看看这个程序:

#include <iostream>

int main(int argc, char* argv[])
{
    std::cin.imbue(locale("es_ES.UTF-8"));
    std::cout.imbue(locale("es_ES.UTF-8"));

    std::cout << "ñeñeñe> ";
    std::string in; 
    std::getline( std::cin, in ); 
    std::cout << in; 

}

我在具有西班牙语语言环境的 windows 机器上使用 visual studio 2022 编译了它。源代码是UTF-8。执行生成的程序时(windows powershell 会话,执行 chcp 65001 将默认编码设置为 UTF-8 后),我看到以下内容:

PS C:\> .\test_program.exe
ñeñeñe> ñeñeñe
 e e e

第一个“ñeñeñe”是正确的:它在输出控制台上正确显示了“ñ”字符。到目前为止,一切都很好。用户输入正确地回显到控制台:另一个好处。但!当它将编码的字符串发送回输出时,“ñ”字符被空 space.

替换

在调试这个程序时,我看到变量“in”捕获了一种不是 utf-8 编码的输入:对于“ñ”它只使用一个字符,而在 utf-8 中字符必须消耗两个。结论是输入对 chcp 命令没有影响。我做错了什么吗?

更新

有人让我看看更改为 wcout/wcin:

时会发生什么
std::wcout << u"ñeñeñe> ";
std::wstring in;
std::getline(std::wcin, in);
std::wcout << in;

行为:

PS C:\> .\test.exe
0,000,7FF,6D1,B76,E30ñeñeñe
 e e e

其他尝试(将字符串设置为 L"ñeñeñe"):

ñeñeñe> ñeñeñe
 e e e

保持原样:

std::wcout << "ñeñeñe> ";

结果是:

eee>

这是目前为止我找到的最接近的解决方案:

int main(int argc, char* argv[])
{
    _setmode(_fileno(stdout), _O_WTEXT);
    _setmode(_fileno(stdin), _O_WTEXT);

    std::wcout << L"ñeñeñe";
    std::wstring in;
    std::getline(std::wcin, in);
    std::wcout << in;

    return 0;
}

解决方案 的方向是正确的。问题:stdin 和 stdout 应该在相同的配置中,因为控制台的 echo 会重写输入。问题是用 \uXXXX 代码编写字符串....我在猜测如何克服它或使用 #define 来克服和澄清文本文字