在Windows中将Unicode输出到控制台使用C++

Jes*_*ley 23 c++ unicode console windows-xp

我还在学习C++,所以忍受我和我的草率代码.我使用的编译器是Dev C++.我希望能够使用cout将Unicode字符输出到控制台.当我尝试这样的事情时:

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    std::cout << "Blah blah blah some gibberish unicode: ??ß??\n";
    system("PAUSE");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它会向控制台输出奇怪的字符,例如μA■Gg.为什么会这样做,我怎样才能展示ĐĄßĞĝ?或者Windows无法实现这一点?

Tyn*_*Tyn 15

怎么样std::wcout

#include <iostream>

int main() {
    std::wcout << L"Hello World!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是标准的宽字符输出流.

尽管如此,正如Adrian指出的那样,这并没有解决这个事实cmd,默认情况下,它不处理Unicode输出.这可以通过手动配置控制台来解决,如Adrian的回答中所述:

  • 启动cmd/u论证;
  • 调用chcp 65001来改变输出格式;
  • 并在控制台中设置unicode字体(如Lucida Console Unicode).

您也可以尝试使用_setmode(_fileno(stdout), _O_U16TEXT);,这需要fcntl.hio.h(如本答案中所述,并在此博客文章中记录).


Adr*_*thy 6

我不确定Windows XP是否会完全支持您的需求.使用命令控制台启用Unicode需要做三件事:

  1. 使用启动命令窗口cmd /u.该/u说你的程序将输出的Unicode.
  2. 使用chcp 65001指示要使用UTF-8,而不是代码页中的一个.
  3. 选择具有更多字形覆盖范围的字体.新版Windows中的命令窗口提供Lucida Console Unicode.我的XP盒子有一个叫做的子集Lucida Console.它没有非常广泛的曲目,但如果你只是试图显示一些重音字符就足够了.

  • 1.`/ u`只表示内置命令在重定向时输出UTF-16而不是ANSI.它对您自己的代码或未重定向的输出没有任何意义.2.由于`WriteFile()`API中的错误导致它返回错误的值,``chcp 65001`无法正常使用UTF-8控制台输出.这个API由标准的C库函数调用,例如`printf()`,其中任何检查返回代码的函数都可能失败或导致不可预测的行为.3.字体建议是正确的,是Windows恕我直言的愚蠢失败. (2认同)

vit*_*aut 6

您可以使用开源 {fmt} 库来便携地打印 Unicode 文本,包括在 Windows 上,例如:

#include <fmt/core.h>

int main() {
  fmt::print("Blah blah blah some gibberish unicode: ??ß??\n");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Blah blah blah some gibberish unicode: ??ß??
Run Code Online (Sandbox Code Playgroud)

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

我不推荐使用,wcout因为它是不可移植的,例如:

Blah blah blah some gibberish unicode: ??ß??
Run Code Online (Sandbox Code Playgroud)

??ß??在 macOS 或 Linux ( https://godbolt.org/z/z81jbb )上错误地打印部件:

Blah blah blah some gibberish unicode: ??ss??
Run Code Online (Sandbox Code Playgroud)

并且在不更改代码页的情况下甚至不能在 Windows 上工作:

Blah blah blah some gibberish unicode:
Run Code Online (Sandbox Code Playgroud)

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

  • @AyxanHaqverdili,好问题。我正在考虑在下一个主要版本中将默认设置切换为 UTF-8,并选择退出旧行为。 (2认同)