如何将wchar_t值打印到控制台?

zed*_*d91 66 c++ string wchar-t unicode-string

例:

#include <iostream>

using namespace std;

int main()
{
    wchar_t en[] = L"Hello";
    wchar_t ru[] = L"??????"; //Russian language
    cout << ru
         << endl
         << en;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码仅打印像地址一样的十六进制值.如何打印wchar_t字符串?

Nat*_*ate 80

编辑:如果您尝试编写无法在默认语言环境中表示的文本,则此方法无效.:-(

std::wcout而不是std::cout.

wcout << ru << endl << en;
Run Code Online (Sandbox Code Playgroud)

  • 控制台不会启用Unicode.输出重定向是挂断,这是8位char遗留问题.它只能在加载了正确控制台字体的俄罗斯机器上输出正确的文本. (8认同)
  • 它只打印英文字符串.俄罗斯呢? (3认同)

Kon*_*rad 13

我能建议std::wcout吗?

所以,像这样:

std::cout << "ASCII and ANSI" << std::endl;
std::wcout << L"INSERT MULTIBYTE WCHAR* HERE" << std::endl;
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到相关问题的更多信息.


vit*_*aut 7

您无法使用标准 C++ 工具便携式打印宽字符串。

\n

相反,您可以使用开源 {fmt} 库来便携式打印 Unicode 文本。例如(https://godbolt.org/z/nccb6j):

\n
#include <fmt/core.h>\n\nint main() {\n  const char en[] = "Hello";\n  const char ru[] = "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82";\n  fmt::print("{}\\n{}\\n", ru, en);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

印刷

\n
\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\nHello\n
Run Code Online (Sandbox Code Playgroud)\n

这需要使用/utf-8MSVC中的编译器选项进行编译。

\n

wcout为了进行比较,在 Linux 上写入:

\n
\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\nHello\n
Run Code Online (Sandbox Code Playgroud)\n

可以将俄语文本音译为拉丁语(https://godbolt.org/z/za5zP8):

\n
Privet\nHello\n
Run Code Online (Sandbox Code Playgroud)\n

这个特殊问题可以通过切换到使用 UTF-8 的区域设置来解决,但 Windows 上也存在类似的问题,无法仅使用标准设施来解决。

\n

免责声明:我是 {fmt} 的作者。

\n