C 便携式方法获取u8字符串文字的值表示
C++ portable way to getting the value representation of a u8 string literal
让我们考虑:
char const str[] = u8"ñ";
auto const* u8_code_units = reinterpret_cast<unsigned char*>(str);
// using u8_code_units elements
这是完全便携式和C 标准标准吗?还是有一些条款说它是不确定的行为或取决于任何未指定的价值?我知道unsigned char
和char
应具有相同的对齐要求,而在这种情况下,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)),
这还不足以保护您。它之所以起作用,是因为标准明确说在这种特殊情况下它有效,而不是因为一致性要求等。char
和unsigned char
对允许此允许的规则有例外;对齐与它无关。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- std::is_base_of表示ctor编译错误
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 询问在设计我的手臂模拟器功能表示格式1
- 将数字打印成文字
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 在 C++17 中表示 std::byte 文字的正确方法是什么?
- C 便携式方法获取u8字符串文字的值表示
- 在C++中,用十六进制或八进制表示的整型文字的默认类型是什么
- 表示模板化数字文字的最佳方式是什么