2010-03-06 61 views
10

从的C++ 0x工作草案,新char型(char16_tchar32_t)的将是底层类型)。符号性处理Unicode的将无符号(<strong>uint_least16_t</strong>和<strong>uint_least32_t</strong>炭和Unicode中的C++ 0x

但就我所看到的(不是很远也许)类型char8_t(基于uint_least8_t)没有定义。为什么?

当你看到一个新的U8编码前缀引入UTF-8字符串字面...基于老朋友(符号/无符号)字符它甚至更加混乱。为什么?

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

char8_t:A型为UTF-8字符和字符串 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0482r0.html

回答

3

char16_tchar32_t应该是用于表示可用代码点。由于没有负面的代码点,所以这些都是无符号的。

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

+2

如果我想存储字符é(U + 00E9),即两个字节序列0xC3 0xA9,并带有一个有符号字符数组,它将失败:signed char e_acute = {0xC3,0xA9} =>这将截断价值。 所以如果你的系统把char定义为signed char,它仍然是一个问题。我错了吗 ? – anno 2010-03-06 04:17:31

+0

很少需要手动输入字节:通常,就像你说的那样,使用'u8'。所以,在这种情况下,高字节会被视为负数。 – 2010-03-06 04:31:51

+1

Chris,有没有保证转换对'unsigned char - > signed char - > unsigned char'会产生原始值?前者的转换是实现定义的,我找不到可以保证往返的任何子句。 – avakar 2010-03-06 06:00:22

3

字符将被用于UTF-8的类型,因为它重新定义,以确保它可以用它来使用:

对于C++编译器增强对Unicode的支持 的目的,的 定义char类型已被 修改为至少需要存储UTF-8的8位编码 的大小 ,并且足够大以包含 编译器的基本 执行字符集的任何成员。之前定义为 只有后者。 C++ 0x将支持三种Unicode编码:UTF-8,UTF-16和 UTF-32。除了前面提到的 指出的对char 定义的修改,C++ 0x将添加两个新字符0​​类型:char16_t和char32_t。这些 旨在分别存储UTF-16和 UTF-32。

来源:http://en.wikipedia.org/wiki/C%2B%2B0x

大多数UTF-8的应用程序的使用焦炭反正已经在PC/MAC。

+0

不说一个签名的话。 – anno 2010-03-06 12:24:47

+0

啊你说得对。 :/ – Klaim 2010-03-06 13:36:04

+0

为什么大胆的部分的尴尬措辞?是不是“UTF-8的八位编码”是多余的? – dan04 2010-03-17 06:50:55

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类型绝对是无符号的。