C++ 此UTF-8实施是否已定义或定义良好?

C++ 此UTF-8实施是否已定义或定义良好?,c++,string,unicode,utf-8,C++,String,Unicode,Utf 8,我只是浏览了一下UTF-8代码点的一些实现(不,不是剽窃),偶然发现: 这是UTF-8在字符串中使用C++的方式。 我认为UTF-8中的代码单元总是正好是8位 来自Unicode标准8.0.0,第2.5章: 在Unicode字符编码模型中,精确定义的编码 表单指定如何使用Unicode字符的每个整数(代码点) 表示为一个或多个代码单元的序列。Unicode 标准为Unicode提供了三种不同的编码形式 字符,使用8位、16位和32位单位。这些是 分别命名为UTF-8、UTF-16和UTF-32

我只是浏览了一下UTF-8代码点的一些实现(不,不是剽窃),偶然发现:

<>这是UTF-8在字符串中使用C++的方式。

我认为UTF-8中的代码单元总是正好是8位
来自Unicode标准8.0.0,第2.5章:

在Unicode字符编码模型中,精确定义的编码 表单指定如何使用Unicode字符的每个整数(代码点) 表示为一个或多个代码单元的序列。Unicode 标准为Unicode提供了三种不同的编码形式 字符,使用8位、16位和32位单位。这些是 分别命名为UTF-8、UTF-16和UTF-32

(删除了换行符,删除了换行符上的连字符,添加了强调符号。)

那么,他为什么声称使用了
const char*
而不是
const uint8*
(或者建议的、假设的
const char8\*

[lex.string]/8普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“array of
n
const char”,其中
n
是下面定义的字符串大小,具有静态存储持续时间(3.7)

因此,不管其他情况如何,UTF-8字符串文字都是一个
char
s序列

关于
uint8\u t

7.20.1.1

2 typedef name
uintN\u t
指定宽度为
N
且无填充位的无符号整数类型。因此,
uint24\u t
表示这种宽度正好为24位的无符号整数类型

3这些类型是可选的。但是,如果一个实现提供了宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号类型)具有2的补码表示,那么它应该定义相应的typedef名称


char
大于8位的假设系统上,不会定义
uint8\u t

[lex.string]/8普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“array of
n
const char”,其中
n
是下面定义的字符串大小,具有静态存储持续时间(3.7)

因此,不管其他情况如何,UTF-8字符串文字都是一个
char
s序列

关于
uint8\u t

7.20.1.1

2 typedef name
uintN\u t
指定宽度为
N
且无填充位的无符号整数类型。因此,
uint24\u t
表示这种宽度正好为24位的无符号整数类型

3这些类型是可选的。但是,如果一个实现提供了宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号类型)具有2的补码表示,那么它应该定义相应的typedef名称


在字符大于8位的假设系统上,
uint8\u t
不会被定义。

uint8\u t
仅存在于具有可访问内存的系统上,而该内存正好是8位。UTF-8没有任何这样的要求。它使用适合8位的值,但对这些值的实际存储方式没有任何要求。每个8位值可以存储为16位或32位,或者任何对运行它的系统有意义的值;唯一的要求是该值必须正确。

uint8\u t
仅存在于具有可精确访问为8位的内存的系统上。UTF-8没有任何这样的要求。它使用适合8位的值,但对这些值的实际存储方式没有任何要求。每个8位值可以存储为16位或32位,或者任何对运行它的系统有意义的值;唯一的要求是该值必须正确。

UTF-8中的代码单元始终正好是8位<代码>无符号字符被指定为至少有8位,因此UTF-8中的所有代码单元都适合类型
无符号字符

u8“这是一个UTF-8编码的字符串常量”
的基本原理不是它存储在8位字节中,而是它被编码为UTF-8,而源文件可能有不同的编码。
u8string
typedef与此一致,但如果字节超过8位,则有点混乱

使用
unsigned char
是消除类型
char

的符号不确定性的一种好方法,UTF-8中的代码单元始终正好是8位<代码>无符号字符被指定为至少有8位,因此UTF-8中的所有代码单元都适合类型
无符号字符

u8“这是一个UTF-8编码的字符串常量”
的基本原理不是它存储在8位字节中,而是它被编码为UTF-8,而源文件可能有不同的编码。
u8string
typedef与此一致,但如果字节超过8位,则有点混乱

使用
unsigned char
是消除类型
char
的签名不确定性的好方法

那么,他为什么声称使用了
const char*
而不是
const uint8*
(或者建议的、假设的
const char8\*

因为标准是这么说的。
u8
文本字符串将解析为
常量字符[N]
类型的数组。正是这样,C++中的UTF-8文字被定义为工作。

如果系统上的
char
超过8位。。。就这样吧。字符串中的每个
char
仍将保留一个介于0和255之间的值,即0到255之间的范围
typedef unsigned char char8_t;
typedef std::basic_string<unsigned char> u8string;
const char *str = u8"This is a UTF-8 string.";