相关疑难解决方法(0)

如何从Windows上的c ++控制台应用程序打印UTF-8

对于在英语Windows(XP,Vista或7)上使用Visual Studio 2008编译的C++控制台应用程序.是否可以打印到控制台并使用cout或wcout正确显示UTF-8编码的日语?

c++ utf-8 console-application

19
推荐指数
4
解决办法
3万
查看次数

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

当从 Windows 中获取输入时std::cin,输入显然始终采用 windows-1252 编码(在我的情况下是主机的默认值),尽管进行了所有配置,但这显然只影响输出。有没有正确的方法以 UTF-8 编码捕获 Windows 中的输入?

\n

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

\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}\n
Run Code Online (Sandbox Code Playgroud)\n

我在具有西班牙语语言环境的 Windows 计算机中使用 Visual Studio 2022 编译了它。源代码采用 UTF-8 格式。执行生成的程序时(Windows powershell 会话,执行后将chcp 65001默认编码设置为 UTF-8),我看到以下内容:

\n
PS C:\\> .\\test_program.exe\n\xc3\xb1e\xc3\xb1e\xc3\xb1e> \xc3\xb1e\xc3\xb1e\xc3\xb1e\n e e e\n
Run 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

更新

\n

有人让我看看更改为 wcout/wcin 时会发生什么:

\n
std::wcout …
Run Code Online (Sandbox Code Playgroud)

c++ windows utf-8 character-encoding visual-studio

5
推荐指数
1
解决办法
1096
查看次数