如何在 char8_t 中存储表情符号并在 C++20 中打印它们?

She*_*don 3 c++ utf-8 utf emoji c++20

我刚刚听说 的存在char8_tchar16_t并且char32_t正在测试它。当我尝试编译下面的代码时,g++抛出以下错误:

\n
error: use of deleted function \xe2\x80\x98std::basic_ostream<char, _Traits>& std::operator<<(basic_ostream<char, _Traits>&, char32_t) [with _Traits = char_traits<char>]\xe2\x80\x99\n    6 |         std::cout << U\'\' << std::endl;\n      |                      ^~~~~\n
Run Code Online (Sandbox Code Playgroud)\n
error: use of deleted function \xe2\x80\x98std::basic_ostream<char, _Traits>& std::operator<<(basic_ostream<char, _Traits>&, char32_t) [with _Traits = char_traits<char>]\xe2\x80\x99\n    6 |         std::cout << U\'\' << std::endl;\n      |                      ^~~~~\n
Run Code Online (Sandbox Code Playgroud)\n

另外,为什么我不能将表情符号放入char8_tchar16_t?例如,以下代码行不起作用:

\n
#include <iostream>\n\nint main() {\n  char32_t c = U\'\';\n\n  std::cout << c << std::endl;\n\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

根据我的理解,表情符号是 UTF-8 字符,因此应该适合char8_t.

\n

Nic*_*las 5

表情符号是 UTF-8 字符

不存在“UTF-8 字符”这样的东西。

有 Unicode 代码点。这些可以用 UTF-8 编码来表示,以便每个代码点映射到一个或多个 UTF-8 代码单元的序列char8_t:但这意味着大多数代码点映射到多个char8_ts:又名字符串。而且表情符号并不属于映射到单个 UTF-8 代码单元的 127 个代码点。

特别是表情符号可以由多个代码点构建,因此即使使用 UTF-32,您也不能保证任何表情符号都可以存储在单个char32_t代码点中。

最好始终将这些内容视为字符串,而不是字符。忘记“角色”的存在。