是否可以在 Linux 和 Windows 上计算出 EM DASH?
Is it possible to cout an EM DASH on Linux and Windows?
我一直没能找到 cout
一个 '-' 字符的方法,无论我是像这样将它放在 cout 语句中:cout << "—";
还是使用 char(151)
,程序打印出一个模糊的未定义字符。你们看到我的代码有什么问题吗? cout
甚至可以使用 EM DASH 吗?
编辑:我也试过 wcout << L"—";
和 std::wcout << wchar_t(0x2014);
。这些都在我的终端上什么都不打印。
首先,EM DASH 是一个 unicode 字符(只要确保您知道)。
打印 unicode 字符取决于您要打印的内容到。
如果您正在打印到 Unix 终端(或模拟器),终端模拟器正在使用支持此字符的编码,并且该编码与编译器的执行编码相匹配,那么您可以在源代码中执行上面的操作 cout << "—";
如果您收到模糊的未定义字符,可能是您的终端不支持该字符。
如果你在 windows(那里更难),你可以做这样的事情(不可移植):
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"—";
}
在 C++ 和各种终端中没有对 Unicode 的普遍支持,因此不会有可移植的解决方案。
问题是 Windows 控制台默认使用控制台中的代码页。它可能在内部使用 UTF-16,但在与外部交互时始终会与当前 ANSI 代码页相互转换。因此,如果没有任何事先设置,简单地打印像 std::wcout << wchar_t(0x2014);
这样的 UTF-16 代码点是行不通的。在使用
打印字符之前,您需要在控制台中 switch to UTF-8 by running chcp 65001
或在代码中 _setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"—";
由于 Windows 控制台中的 Unicode 支持较差,因此它并不总是有效。在许多情况下,由于渲染器或字体中的问题,字符不会出现,而是用正方形或 ????
代替。但在那种情况下,只需将文本复制出来并粘贴到任何 Unicode 文本框,然后它就会正确显示
如果您在英语或其他一些使用 codepage 1252/ISO-8859-1 then you can print em-dash which is at the codepoint 151 的西欧语言中使用 Windows,只需
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 上使用宽字符串,您通常会得到意想不到的结果。由于 some possible bugs in libc
,std::wcout << L"—"
不会经常工作
也就是说,Windows 10 控制台现在 and even allows to use UTF-8 as the locale 所以如果你不需要支持 Windows 7 那么 有一个通用的方法 打印任何 Unicode 字符串:
std::cout << u8"—";
我一直没能找到 cout
一个 '-' 字符的方法,无论我是像这样将它放在 cout 语句中:cout << "—";
还是使用 char(151)
,程序打印出一个模糊的未定义字符。你们看到我的代码有什么问题吗? cout
甚至可以使用 EM DASH 吗?
编辑:我也试过 wcout << L"—";
和 std::wcout << wchar_t(0x2014);
。这些都在我的终端上什么都不打印。
首先,EM DASH 是一个 unicode 字符(只要确保您知道)。
打印 unicode 字符取决于您要打印的内容到。
如果您正在打印到 Unix 终端(或模拟器),终端模拟器正在使用支持此字符的编码,并且该编码与编译器的执行编码相匹配,那么您可以在源代码中执行上面的操作 cout << "—";
如果您收到模糊的未定义字符,可能是您的终端不支持该字符。
如果你在 windows(那里更难),你可以做这样的事情(不可移植):
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"—";
}
在 C++ 和各种终端中没有对 Unicode 的普遍支持,因此不会有可移植的解决方案。
问题是 Windows 控制台默认使用控制台中的代码页。它可能在内部使用 UTF-16,但在与外部交互时始终会与当前 ANSI 代码页相互转换。因此,如果没有任何事先设置,简单地打印像 std::wcout << wchar_t(0x2014);
这样的 UTF-16 代码点是行不通的。在使用
chcp 65001
或在代码中 _setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"—";
由于 Windows 控制台中的 Unicode 支持较差,因此它并不总是有效。在许多情况下,由于渲染器或字体中的问题,字符不会出现,而是用正方形或 ????
代替。但在那种情况下,只需将文本复制出来并粘贴到任何 Unicode 文本框,然后它就会正确显示
如果您在英语或其他一些使用 codepage 1252/ISO-8859-1 then you can print em-dash which is at the codepoint 151 的西欧语言中使用 Windows,只需
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 上使用宽字符串,您通常会得到意想不到的结果。由于 some possible bugs in libc
,std::wcout << L"—"
不会经常工作
也就是说,Windows 10 控制台现在
std::cout << u8"—";