gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:45:42 29 4
gpt4 key购买 nike

新的 char8_t 如何与 C 接口(interface)一起使用?

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 不能用于获取基于 char8_t 的指针charunsigned char 基于数据,但在另一个方向使用 reinterpret_cast 是可以的(因为 charunsigned char 已经被允许为所有类型起别名;参见 [basic.lval]p11 )。

避免在整个代码库中散布 reinterpret_cast 的选项是提供重载来包装基于 char 的接口(interface)。例如:

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);
}

关于c++ - 如何正确地将 u8 字符串文字传递给接受 UTF-8 字符串的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118539/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com