对于在英语Windows(XP,Vista或7)上使用Visual Studio 2008编译的C++控制台应用程序.是否可以打印到控制台并使用cout或wcout正确显示UTF-8编码的日语?
当从 Windows 中获取输入时std::cin,输入显然始终采用 windows-1252 编码(在我的情况下是主机的默认值),尽管进行了所有配置,但这显然只影响输出。有没有正确的方法以 UTF-8 编码捕获 Windows 中的输入?
例如,让我们看看这个程序:
\n#include <iostream>\n\nint main(int argc, char* argv[])\n{\n std::cin.imbue(locale("es_ES.UTF-8"));\n std::cout.imbue(locale("es_ES.UTF-8"));\n\n std::cout << "\xc3\xb1e\xc3\xb1e\xc3\xb1e> ";\n std::string in; \n std::getline( std::cin, in ); \n std::cout << in; \n\n}\nRun Code Online (Sandbox Code Playgroud)\n我在具有西班牙语语言环境的 Windows 计算机中使用 Visual Studio 2022 编译了它。源代码采用 UTF-8 格式。执行生成的程序时(Windows powershell 会话,执行后将chcp 65001默认编码设置为 UTF-8),我看到以下内容:
PS C:\\> .\\test_program.exe\n\xc3\xb1e\xc3\xb1e\xc3\xb1e> \xc3\xb1e\xc3\xb1e\xc3\xb1e\n e e e\nRun Code Online (Sandbox Code Playgroud)\n第一个“\xc3\xb1e\xc3\xb1e\xc3\xb1e”是正确的:它在输出控制台正确显示“\xc3\xb1”字符。到目前为止,一切都很好。用户输入正确地回显到控制台:另一个优点。但!当它转向将编码字符串发送回输出时,“\xc3\xb1”字符被空白替换。
\n调试此程序时,我发现变量“in”已捕获非 utf-8 编码的输入:对于“\xc3\xb1”,它仅使用一个字符,而在 utf-8 中,该字符必须消耗两个。结论是输入对chcp命令没有影响。我做错了什么吗?
更新
\n有人让我看看更改为 wcout/wcin 时会发生什么:
\nstd::wcout …Run Code Online (Sandbox Code Playgroud)