C++ 0x中char和Unicode的签名

ann*_*nno 10 c++ unicode utf-8 char c++11

从C++ 0x工作草案中,用于处理Unicode 的新char类型(char16_tchar32_t)将是无符号的(uint_least16_tuint_least32_t将是基础类型).

但据我所知(也许不是很远),没有定义类型char8_t(基于uint_least8_t).为什么?

当你看到为UTF-8字符串文字引入一个新的u8编码前缀时,它会更加令人困惑......基于老朋友(sign/unsigned)char.为什么?

更新:有一个添加新类型的建议:char8_t

char8_t:UTF-8字符和字符串的类型(修订版1) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0482r1.html

Chr*_*ung 1

char16_tchar32_t应该可用于表示代码点。由于没有负代码点,因此对它们进行无符号处理是明智的。

UTF-8 不直接表示代码点,因此u8的基础类型是否有符号并不重要。

  • 我的观点是,如果您从某个地方接收 UTF-8 数据(作为 0--255 范围内的数字序列,这就是 UTF-8 的定义方式),您无法可靠地将它们存储在 char 数组中,因为通过转换回“unsigned char”获得的值可能会有所不同(我什至不确定“CHAR_BIT”是否保证至少为8)。为了可靠性,您必须使用 `uint_least8_t`,对我来说,为其提供 `char8_t` typedef 似乎很有用且一致。 (3认同)
  • 如果我想存储字符 é (U+00E9),即两个字节序列 0xC3 0xA9,使用有符号字符数组,它将失败:signed char e_acute = {0xC3,0xA9} => 这将截断该值。所以如果你的系统将char定义为signed char,这仍然是一个问题。我错了吗 ? (2认同)