为什么u8'A'可以是char类型,而UTF-8最多可以是4个字节,char通常是1个字节?

Ric*_*ick 8 c++

我正在阅读wchar_t在一般编程中有什么用?并在接受的答案中发现了令人困惑的事情:

使用带有可变宽度编码的char更常见,例如UTF-8或GB 18030.

我从教科书中找到了这个:

图片

UTF-8的Unicode编码最多不是4个字节吗?char对于大多数平台是1字节.我误解了什么吗?


更新:

搜索和阅读后,现在我知道:

  1. 代码点和代码单元是不同的东西.代码点是唯一的,而代码单元依赖于编码.
  2. u8'a'(一个char,这里不是字符串)只允许用于基本字符集(ASCII及其控制字符的东西),它的值是相应的'a'的代码单元值,对于ascii字符,代码单位与代码点的值相同.(这是@codekaizer的回答)
  3. std::string::size() 返回代码单元.

那么编辑们都在处理代码单元吗?如果我将文件编码从utf8更改为uft32,那么大小?将是4

Jos*_* D. 5

用utf8进行的unicode编码最多不是4个字节吗?

根据lex.ccon/3,强调我的:

以u8开头的字符文字,例如u8'w',是char类型的字符文字,称为UTF-8字符文字.UTF-8字符文字的值等于其ISO 10646代码点值,前提是代码点值可用单个UTF-8代码单元表示(即,如果它在C0控件和基本拉丁语Unicode中块).如果使用单个UTF-8代码单元无法表示该值,则该程序格式错误.包含多个c-chars的UTF-8字符文字格式不正确.

单个UTF-8代码单元是1个字节.


Mat*_*lia 4

您将代码点与代码单元混淆了。

\n\n

在 UTF-8 中,每个代码单元(特定编码使用的 \xe2\x89\x88 数据类型)都是一个字节(8 位),因此可以在 C++ 程序中用类型char(标准保证的类型)表示至少 8 位)。

\n\n

现在,当然,如果代码单元太小,您就无法在单个代码单元中表示所有 Unicode代码点(\xe2\x89\x88 字符/字形) - 它们目前远超过 100 万个,而一个字节只能有 256 个不同的价值观。因此,UTF-8 使用更多的代码单元来表示单个代码点(并且为了节省空间和兼容性,使用可变长度编码)。因此,码点 (U+1F600) 将映射到 4 个码单元 (f0 9f 98 80)。

\n\n

最重要的是,C++ 几乎在所有地方都只关心代码单元 - 字符串大多被视为不透明的二进制 blob(C 字符串的 0 字节除外)。例如,strlenstd::string::size()都会报告代码单元的数量,而不是代码点的数量。

\n\n

上面引用的u8是罕见的例外之一。它向编译器表明,包含在文字中的字符串必须从编译器用于读取源文件的任何编码映射到 UTF-8 字符串。

\n