如何正确地将 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 是可以的(因为 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);
}