【问题标题】:Is it possible to cout an EM DASH on Linux and Windows? [duplicate]是否可以在 Linux 和 Windows 上计算 EM DASH? [复制]
【发布时间】:2016-01-06 21:48:48
【问题描述】:

我一直无法找到cout '-' 字符的方法,无论我将其放在 cout 语句中,例如:cout << "—"; 还是使用 char(151),程序都会打印出一个模糊的 undefined特点。你们看到我的代码有什么问题吗? couting EM DASH 有可能吗?

编辑:我也试过wcout << L"—";std::wcout << wchar_t(0x2014);。这两个都在我的终端上不打印任何内容。

【问题讨论】:

标签: c++ unicode cout


【解决方案1】:

首先,EM DASH 是一个 unicode 字符(只是确保你知道这一点)。

打印 unicode 字符取决于您要打印的内容。 如果您要打印到 Unix 终端(或模拟器),终端模拟器正在使用支持此字符的编码,并且该编码与编译器的执行编码相匹配,那么您可以在源代码中执行上述操作 @ 987654321@

如果您收到模糊的未定义字符,则可能是您的终端不支持该字符。

如果您在 Windows 中(更难),您可以执行以下操作(不可移植):

#include <iostream>
#include <io.h>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"—";
}

【讨论】:

  • 您的打印方式可能有误。 wcout &lt;&lt; L"—"; 可以工作
  • @LưuVĩnhPhúc 我试过了,它会导致程序什么也不打印。
  • 就像@LưuVĩnhPhúc 建议的那样,我已经更新了我的 windows 答案
  • 叹息,我希望有一个通用的方法来做到这一点,但这并不能改变你给出了一个非常彻底和正确答案的事实。谢谢。
  • 嘿,我们不能拥有一切 :)
【解决方案2】:

在 C++ 和各种终端中没有对 Unicode 的通用支持,因此不会有可移植的解决方案。

问题是 Windows 控制台默认使用控制台中的代码页。它可能在内部使用 UTF-16,但在与外部交互时总是会与当前的 ANSI 代码页相互转换。因此,如果没有任何事先设置,简单地打印像 std::wcout &lt;&lt; wchar_t(0x2014); 这样的 UTF-16 代码点是行不通的。您需要通过在控制台中运行chcp 65001 或在代码中运行_setmode(_fileno(stdout), _O_U16TEXT);switch to UTF-8,然后才能使用

std::wcout << L"—";

由于 Windows 控制台中的 Unicode 支持较差,它并不总是有效。在许多情况下,由于渲染器或字体中的问题,字符不会出现,替换为正方形或????。但在这种情况下,只需将文本复制出来并粘贴到任何 Unicode 文本框,它就会正确显示

如果您使用的是英文版的 Windows 或使用 codepage 1252/ISO-8859-1 的其他一些西欧语言,那么您可以打印 codepoint 151 处的 em-dash,只需通过

cout << (char)151;

如果它不起作用,那么您不在代码页 1252 上。如果可能,您可以将其更改为 1252,或者在您的代码页中查找 em-dash(如果可用)

在 Linux 上事情要简单得多,因为默认使用 UTF-8。因此,您可以正常输出字符串而无需诉诸std::wcout

std::cout << "—"; // need to make sure that std::string is in UTF-8
// or use std::cout << u8"—" to force the encoding

事实上,如果您在 Linux 上使用宽字符串,您经常会得到意想不到的结果。 std::wcout &lt;&lt; L"—" 不会经常工作,因为some possible bugs in libc


也就是说,Windows 10 控制台现在 supports UTF-8 perfectly 甚至允许 use UTF-8 as the locale 所以如果您不需要支持 Windows 7 那么有一个通用方法可以打印任何 Unicode 字符串:

std::cout << u8"—";

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2011-11-10
    • 1970-01-01
    • 2013-10-20
    • 2019-11-11
    相关资源
    最近更新 更多