如何正确地将 u8 字符串文字传递给接受 UTF-8 字符串的 C 函数
How to properly pass u8 string literal to C function accepting UTF-8 string
如何将新char8_t
与C接口一起使用?
extern "C"
{
struct PangoLayout;
void pango_layout_set_text(PangoLayout* layout, char const* text, int length);
}
#include <string_view>
void printText(PangoLayout* layout, std::u8string_view str)
{
// Does not compile:
// pango_layout_set_text(layout, static_cast<char const*>(str.data()), std::size(str));
// Does not compile:
// pango_layout_set_text(layout, static_cast<char const*>(str.data()), std::size(str));
// UB?:
pango_layout_set_text(layout, reinterpret_cast<char const*>(str.data()), std::size(str));
}
void hello(PangoLayout* layout)
{
printText(layout, u8"Hello@ł€ð®þ$đßđ®");
}
在这种情况下继续使用字符更好吗?这避免了reinterpret_cast
但也降低了表现力。
免责声明:我是char8_t
P0482 提案的作者。
P1423 记录了许多方法和技术,旨在帮助解决因采用 P0482 而导致的向后兼容性问题。
使用reinterpret_cast
是一个可行的(如果令人反感的)选择。 请注意,由于char8_t
不是别名类型,因此不能使用reinterpret_cast
来获取指向基于char
或unsigned char
的数据的基于char8_t
的指针,但可以在另一个方向上使用reinterpret_cast
(因为已经允许char
和unsigned char
为所有类型设置别名;请参阅 [basic.lval]p11)。
避免将reinterpret_cast
洒满代码库的一个选项是提供包装基于char
的接口的重载。 例如:
inline void pango_layout_set_text(PangoLayout* layout, char8_t const* text, int length) {
return pango_layout_set_text(layout, reinterpret_cast<char const*>(text), length);
}
相关文章:
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 在C++中使用 UTF-8 字符串和字符
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- C++ 将 UTF-8 转换为字符串
- 无法将字符数组转换为包含 utf-8 字符的字符串
- 从 UTF-8 字节数组创建字符串?
- 在 node.js 中将缓冲区从 C++ 转换为 UTF-8 字符串
- 如何在 Visual C++ 中使用 UTF-8 字符串作为字符*?
- 如何在 c++ 中读取用 utf-8 编码的 java unicode 字节字符串
- 六角字符串到UTF-8(UNICODE)字符串
- 如何正确地将 u8 字符串文字传递给接受 UTF-8 字符串的 C 函数
- 查找十六进制字符串是 utf-8 或 utf-16
- 如何将 PyObject 转换为 UTF-8 字符串
- 将转义的 UTF-8 八位字节的字符数组转换为 C++ 的字符串
- UTF-8字符串上的位XOR操作可提供非UTF-8输出
- 如何将UTF-8字符串转换为流的编码
- 如何在Qt中通过QTcpSocket发送UTF-8编码的字符串
- cpp 预处理器无法识别 UTF-32 字符串
- 检查 UTF-8 字符串在现代C++中是否有效
- C++ 字符串 UTF-8 编码