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_t
和char32_t
应该可用于表示代码点。由于没有负代码点,因此无需签名就明智了。
UTF-8不直接表示代码点,因此u8
的基础类型是否已签名无关紧要。
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类型肯定是无符号的。
以上是关于C ++ 0x中char和Unicode的签名的主要内容,如果未能解决你的问题,请参考以下文章
C / C ++如何读取UNICODE的const char?
在C#中如何获得以Unicode格式打印的char的最小值和最大值?