如何正确地将 u8 字符串文字传递给接受 UTF-8 字符串的 C 函数

How to properly pass u8 string literal to C function accepting UTF-8 string

本文关键字:字符串 UTF-8 函数 正确地 u8 文字      更新时间:2023-10-16

如何将新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_tP0482 提案的作者。

P1423 记录了许多方法和技术,旨在帮助解决因采用 P0482 而导致的向后兼容性问题。

使用reinterpret_cast是一个可行的(如果令人反感的)选择。 请注意,由于char8_t不是别名类型,因此不能使用reinterpret_cast来获取指向基于charunsigned char的数据的基于char8_t的指针,但可以在另一个方向上使用reinterpret_cast(因为已经允许charunsigned 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);
}