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

时间:2019-07-19 19:20:40

标签: interop c++20

新的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,但也会降低表达能力。

1 个答案:

答案 0 :(得分:1)

免责声明:我是char8_t P0482提案的作者。

P1423介绍了旨在帮助解决由于采用P0482而导致的向后兼容性问题的许多方法和技术。

使用reinterpret_cast是可行的(如果令人反感的)选项。请注意,由于char8_t不是别名类型,因此reinterpret_cast不能用于获取基于char8_t的指向char或{{1基于}}的数据,但可以在另一方向使用unsigned char(因为已经允许reinterpret_castchar为所有类型加上别名;请参见[basic.lval]p11)。

避免在整个代码库中撒满unsigned char的一种选择是提供重载包装基于reinterpret_cast的接口。例如:

char