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

时间:2010-05-17 12:33:25

标签: c++ unicode windows-xp console

我还在学习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;
}

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

5 个答案:

答案 0 :(得分:14)

std::wcout怎么样?

#include <iostream>

int main() {
    std::wcout << L"Hello World!" << std::endl;
    return 0;
}

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

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

  • 使用cmd参数启动/u;
  • 调用chcp 65001更改输出格式;
  • 在控制台中设置unicode字体(如Lucida Console Unicode)。

您还可以尝试使用_setmode(_fileno(stdout), _O_U16TEXT);,这需要fcntl.hio.h(如this answer中所述,并记录在this blog post中)。

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

您可以使用 the open-source {fmt} library 可移植地打印 Unicode 文本,包括在 Windows 上,例如:

#include <fmt/core.h>

int main() {
  fmt::print("Blah blah blah some gibberish unicode: ĐĄßĞĝ\n");
}

输出:

Blah blah blah some gibberish unicode: ĐĄßĞĝ

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

我不建议使用 wcout,因为它不可移植,例如:

std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

将在 macOS 或 Linux (https://godbolt.org/z/z81jbb) 上错误地打印 ĐĄßĞĝ 部分:

Blah blah blah some gibberish unicode: ??ss??

并且在不更改代码页的情况下甚至无法在 Windows 上运行:

Blah blah blah some gibberish unicode:

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

答案 3 :(得分:1)

您使用了ANSI输出流。您需要使用
std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

另外,使用std :: cin.get(),而不是system(“PAUSE”)

答案 4 :(得分:-3)

在Linux中,我可以天真地做:

std::cout << "ΐ , Α, Β, Γ, Δ, ,Θ , Λ, Ξ, ... ±, ... etc";

它适用于我尝试的大多数角色。