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

问题描述 投票:10回答:3

从C ++ 0x工作草案中,用于处理Unicode的新char类型(char16_t和char32_t)将是无符号的(uint_least16_t和uint_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

c++ unicode utf-8 char c++11
3个回答
3
投票

char将是用于UTF-8的类型,因为它被重新定义以确保它可以与它一起使用:

为了在C ++编译器中增强对Unicode的支持,char类型的定义已经被修改为至少是存储UTF-8的8位编码所必需的大小,并且足够大以包含编译器的任何成员。基本执行字符集。它以前只定义为后者。 C ++ 0x将支持三种Unicode编码: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。


2
投票

char16_tchar32_t应该可用于表示代码点。由于没有负代码点,因此无需签名就明智了。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.