C++ 此UTF-8实施是否已定义或定义良好?
我只是浏览了一下UTF-8代码点的一些实现(不,不是剽窃),偶然发现: <>这是UTF-8在字符串中使用C++的方式。 我认为UTF-8中的代码单元总是正好是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
来自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 ofn
const char”,其中n
是下面定义的字符串大小,具有静态存储持续时间(3.7)
因此,不管其他情况如何,UTF-8字符串文字都是一个char
s序列
关于uint8\u t
:
7.20.1.1
2 typedef nameuintN\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 ofn
const char”,其中n
是下面定义的字符串大小,具有静态存储持续时间(3.7)
因此,不管其他情况如何,UTF-8字符串文字都是一个char
s序列
关于uint8\u t
:
7.20.1.1
2 typedef nameuintN\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.";