如何正确地将 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@ł€ð®þ$đßđ®");
}
在这种情况下继续使用char更好吗?这避免了reinterpret_cast
但也降低了表现力。
免责声明:我是 char8_t
P0482 提案的作者。
P1423 记录了许多旨在帮助解决因采用 P0482 而导致的向后兼容性问题的方法和技术。
使用 reinterpret_cast
是一个可行的(如果令人厌恶的话)选项。请注意,因为 char8_t
是 而不是 别名类型,所以 reinterpret_cast
不能用于获取指向 char
或基于 char8_t
的指针基于 unsigned char
的数据,但在另一个方向使用 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);
}
新的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@ł€ð®þ$đßđ®");
}
在这种情况下继续使用char更好吗?这避免了reinterpret_cast
但也降低了表现力。
免责声明:我是 char8_t
P0482 提案的作者。
P1423 记录了许多旨在帮助解决因采用 P0482 而导致的向后兼容性问题的方法和技术。
使用 reinterpret_cast
是一个可行的(如果令人厌恶的话)选项。请注意,因为 char8_t
是 而不是 别名类型,所以 reinterpret_cast
不能用于获取指向 char
或基于 char8_t
的指针基于 unsigned char
的数据,但在另一个方向使用 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);
}