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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ 0x中char和Unicode的签名相关的知识,希望对你有一定的参考价值。

从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

答案

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。

另一答案

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

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

另一答案

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

以上是关于C ++ 0x中char和Unicode的签名的主要内容,如果未能解决你的问题,请参考以下文章

问题签名char c++

C / C ++如何读取UNICODE的const char?

在C#中如何获得以Unicode格式打印的char的最小值和最大值?

存储在 C char 中的 Unicode

如何在 C++ 中使用 UTF-8 和 Unicode? C++20 char8_t 有多大?

java 中的 char 数据类型