【问题标题】:unicode output not showing in windows console [duplicate]unicode输出未显示在Windows控制台中[重复]
【发布时间】:2018-04-08 17:52:24
【问题描述】:

为了将下标显示为输出,我在 C++ 代码中使用了 Unicode。例如u2080 用于下标 0,但是,Windows 控制台中的输出在控制台屏幕上显示一些奇怪的字符,而在 ubuntu 终端中它显示精确的下标 0。

为什么 unicode 没有显示在 Windows 控制台中。

【问题讨论】:

  • 因为 Windows 控制台默认使用非 unicode 的“代码页”。您可以将其配置为使用 UTF-8 (related)。
  • @FelixPalmen - windows 和控制台使用 utf-16 作为本机。当我们以 utf-16 (WriteConsoleW) 输出时 - 使用哪个代码页无关紧要 - 处理文本时无需任何翻译。仅当我们使用 not W api 将多字节转换为 utf-16 时才使用代码页
  • @RbMm 我认为这不是真的。 Windows 使用 UTF-16,正确(以 UCS-2 开始)。但是控制台是一个不同的野兽,可能是为了向下兼容。在我的机器上,默认代码页是850几乎与 ISO-8859-15 相同)
  • @RbMm 关于您的编辑:使用本机 win32 控制台 API 时可能是这样。使用 C 或 C++ 编程,您通常希望保持可移植性,因此您使用 stdio / iostreams
  • @FelixPalmen - 你错了。我说的 100% 正确。控制台当然使用 utf-16 作为本机。我很清楚这一点。当我们使用 W api - “代码页” 没有任何作用。当且仅当我们使用 A api 或 WriteFile fpr 输出时使用代码页。

标签: c++ windows unicode


【解决方案1】:

您需要为控制台窗口选择正确的代码页。

类似于下面的代码行,函数的详细信息可以找到here.

// Set code page for font character set
SetConsoleOutputCP(CP_UTF8);

【讨论】:

  • 请注意,在 Windows 8 之前,将输出代码页设置为 UTF-8 会误报通过 _write 等写入控制台的字节数。而不是像预期的那样返回写入的字节数,底层WriteFileWriteConsoleA 返回写入的已解码UTF-16 代码的数量。这会导致缓冲流重试部分写入,这会创建与写入的非 ASCII 字符数成比例的乱码尾随序列,每个字符需要 2-4 个 UTF-8 字节。对于需要 3 个 UTF-8 字节的代码来说,这是最糟糕的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2021-08-27
  • 2012-12-13
  • 2011-02-20
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多