我刚刚听说了char8_t
,char16_t
,char32_t
的存在,我正在测试,当我尝试编译下面的代码时,g++
抛出了以下错误:
error: use of deleted function ‘std::basic_ostream<char, _Traits>& std::operator<<(basic_ostream<char, _Traits>&, char32_t) [with _Traits = char_traits<char>]’
6 | std::cout << U'😋' << std::endl;
| ^~~~~
#include <iostream>
int main() {
char32_t c = U'😋';
std::cout << c << std::endl;
return 0;
}
另外,为什么我不能将表情符号放入char8_t
或char16_t
中?例如,以下代码行无法工作:
char16_t c1 = u'😋';
char8_t c2 = u8'😋';
auto c3 = u'😋';
auto c4 = u8'😋';
据我所知,表情符号是UTF-8字符,因此应该适合char8_t
。
4条答案
按热度按时间svmlkihl1#
表情符号是UTF-8字符
根本就没有“UTF-8字符”这回事。
有Unicode码点,它们可以用UTF-8编码表示,这样每个码点Map到一个或多个UTF-8代码单元的序列:但这意味着大多数码点Map到多个
char8_t
:也就是字符串,Emojis并不在Map到一个UTF-8代码单元的127个代码点之列。特别是表情符号可以由 * 多个 * 代码点构建,因此即使使用UTF-32,也不能保证任何表情符号都可以存储在单个
char32_t
代码点中。在任何时候,最好把这些东西当作字符串,而不是字符,甚至忘记“字符”的存在。
imzjd6km2#
当我试图编译下面的代码时,g ++抛出了以下错误:
窄标准流和宽标准流所需的编码取决于实现,也可能取决于最终打印到的终端所需的编码。如果要分别打印到
std::cout
或std::wcout
,则需要将字符转换为char
或wchar_t
类型的正确编码。另外,为什么我不能将表情符号放入char8_t或char16_t中?例如,以下代码行无法工作:
表情符号是Unicode代码点U +1F60B,在UTF-8和UTF-16编码中都需要多个代码单元。但您尝试形成的是一个 * 字符文本 *,它只包含 * 一个 * 代码单元。
从我的理解来看,表情符号是UTF-8字符[...]
这是没有意义的。UTF-8是一个编码的Unicode码点。这是没有意义的说一个字符"是UTF-8"。这表明你可能有根本的误解如何Unicode和字符/字符串编码一般工作。我建议你阅读一些介绍的主题。
xytpbqjk3#
这个管用
解释。
1.是😋多字节序列,不适合单个
char
。因此应使用const char*
。1.默认的源文件编码是UTF-8,因此Unicode字符只能用于UTF-8编码。对于
char32_t
,它应该写为U'\x1F60B'
。1.对于
char8_t
、char16_t
和char32_t
,删除了operator<<(std::basic_ostream)
。nukf8bse4#