【发布时间】:2023-03-27 15:29:01
【问题描述】:
我们知道像'═' 这样的东西会给出一个多字符常量警告。另一种方法是使用 0x2550 或 "\u2550"。但是,后者需要打印功能支持\u 转义序列。但是我不想到处使用十六进制。有没有一种我可以使用的语言结构,当我真正的意思是uint32_t c = 0x2550,即'='u时,我可以写'='。
【问题讨论】:
我们知道像'═' 这样的东西会给出一个多字符常量警告。另一种方法是使用 0x2550 或 "\u2550"。但是,后者需要打印功能支持\u 转义序列。但是我不想到处使用十六进制。有没有一种我可以使用的语言结构,当我真正的意思是uint32_t c = 0x2550,即'='u时,我可以写'='。
【问题讨论】:
”我们知道像'═'这样的东西会给出一个多字符常量警告。
没有。
” 替代方法是使用 0x2550 或“\u2550”。
没有。
”但是后者需要打印函数支持\u转义序列。
没有。
” 但是我不想到处使用十六进制。当我真正的意思是 uint32_t c = 0x2550,即 '═'u 时,是否有我可以使用的语言结构允许我写 '═'。
是的。
uint32_t c = L'═';
使用支持该字符的源编码。
但对于不在 Unicode 基本多语言平面中的字符,它会涉及更多,因为 Windows 中的 wchar_t 与原始 Unicode 一样只有 16 位。
【讨论】:
L 前缀使用wchar_t 生成一个字面量,因为它在不同平台上的大小不同,所以移植性不太好。在 C++11 中,如果您需要以可移植的数字形式存储字符,最好使用 char16_t c = u'═'; 或 char32_t c = U'═';。
u 前缀。便携怎么样,你觉得呢?哈哈:)
wchar_t 对于答案中提到的限制(即 BMP)非常便携。例如这就是为什么许多大型便携式 GUI 框架将字符串文字转换为宽字符串的原因。所以你的两个假设都是错误的:与你的假设相反,wchar_t 不是很便携,它是,与你的假设相反,C++11 u 前缀非常便携,它根本不是便携的。还没有。
\u 序列由 C++ 编译器解释,而不是由“打印函数”解释。但是,您需要使用宽字符串 (std::wstring) 来存储字符。例如:
#include <iostream>
#include <string>
int main() {
std::wstring s(L"\u2550");
std::wcout << s.size() << std::endl
<< std::hex << static_cast<int>(s[0]) << std::dec << std::endl
<< s << std::endl;
return 0;
}
输出显示这个字符串只有一个字符。
【讨论】: