从C ++ 0x工作草案中,用于处理Unicode的新char类型( char16_t 和 char32_t )将是无符号的( uint_least16_t uint_least32_t 将是基础类型。
但据我所知(可能不是很远),未定义类型 char8_t (基于 uint_least8_t )。为什么?
当你看到为UTF-8字符串文字引入了一个新的 u8 编码前缀时,它会更加令人困惑......基于老朋友(签名/未签名) char 。为什么?
更新: 有一个建议添加一个新类型:char8_t
char8_t:UTF-8字符和字符串的类型(修订版1) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0482r1.html
答案 0 :(得分:3)
char将是用于UTF-8的类型,因为它被重新定义以确保它可以与它一起使用:
为了加强支持 对于C ++编译器中的Unicode, char类型的定义已经存在 修改为至少大小 存储8位编码所必需的 UTF-8的大小足以容纳 编译器的任何基本成员 执行字符集。它是 以前只定义为后者。 有三种Unicode编码 C ++ 0x将支持:UTF-8,UTF-16和 UTF-32。除了以前 注意到对定义的修改 char,C ++ 0x将添加两个新字符 类型:char16_t和char32_t。这些 旨在存储UTF-16和 UTF-32分别。
来源:http://en.wikipedia.org/wiki/C%2B%2B0x
大多数UTF-8应用程序在PC / mac上都使用了char。
答案 1 :(得分:2)
char16_t
和char32_t
应该可用于表示代码点。由于没有负代码点,因此无需签名是明智的。
UTF-8不直接代表代码点,因此u8
的基础类型是否签名无关紧要。
答案 2 :(得分:1)
C ++ 0x草案似乎并未表明新的Unicode字符类型是否已签名或未签名。但是,正如其他人已经提到的那样,由于没有负的Unicode代码点,因此char16_t
和char32_t
无符号会更有意义。 (再说一遍,char
无条件有意义,但自70年代以来我们一直在处理“负面”角色。)
此外,由于UTF-16的范围从0x0到0xFFFF(忽略代理对),因此您需要整个范围的无符号16位整数来正确表示所有值。至少可以说,如果代码点0x8000到0xFFFF被表示为带有char16_t
的负数,那将是很尴尬的。
无论如何,在C ++ 0x委员会对此事做出明确的决定之前,你总是可以检查一下你的实现:
#include <type_traits>
#include <iostream>
int main()
{
std::cout << std::boolalpha << std::is_signed<char16_t>::value << std::endl;
}
这在Linux上使用GCC 4.45打印出false
。所以至少在一个平台上,新的Unicode类型肯定是无符号的。