C 便携式方法获取u8字符串文字的值表示

C++ portable way to getting the value representation of a u8 string literal

本文关键字:文字 表示 字符串 u8 便携式 方法 获取      更新时间:2023-10-16

让我们考虑:

char const str[] = u8"ñ";
auto const* u8_code_units = reinterpret_cast<unsigned char*>(str); 
// using u8_code_units elements

这是完全便携式和C 标准标准吗?还是有一些条款说它是不确定的行为或取决于任何未指定的价值?我知道unsigned charchar应具有相同的对齐要求,而在这种情况下,reinterpret_cast<T*>(v)等于static_cast<T*>(static_cast<void*>(v)),因此,我认为使用它是完全安全且可移植的,但我不确定。

是完全便携式和C 标准标准?

有点,但不是因为您认为的原因。

请参阅,您实际上必须将该文件保存到某种格式的磁盘。这意味着您的编译器必须能够读取相同的格式。编译器支持的哪些文本格式是实现定义的。

但是,如果您的编译器支持您保存的格式,并且该格式可以保存Unicode编码的字符,则您的编译器将在此处执行正确的操作。

即使是reinterpret_cast也可以,因为编译器要求即使平台的char签名,也可以通过unsigned char数组访问char数组。并且标准明确要求,当通过unsigned char读取UTF-8格式的char数组时,您将获得UTF-8格式的期望。

注意:

我知道未签名的char和char应具有相同的对齐要求,而在这种情况下,retinterpret_cast(v)等于static_cast(static_cast(v)),

这还不足以保护您。它之所以起作用,是因为标准明确说在这种特殊情况下它有效,而不是因为一致性要求等。charunsigned char对允许此允许的规则有例外;对齐与它无关。