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

时间:2010-03-06 03:45:42

标签: c++ unicode utf-8 char c++11

从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

3 个答案:

答案 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_tchar32_t应该可用于表示代码点。由于没有负代码点,因此无需签名是明智的。

UTF-8不直接代表代码点,因此u8的基础类型是否签名无关紧要。

答案 2 :(得分:1)

C ++ 0x草案似乎并未表明新的Unicode字符类型是否已签名或未签名。但是,正如其他人已经提到的那样,由于没有负的Unicode代码点,因此char16_tchar32_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类型肯定是无符号的。