gpt4 book ai didi

c++ - char8_t 和 utf8everywhere : How to convert to const char* APIs without invoking undefined behaviour?

转载 作者:行者123 更新时间:2023-12-05 08:10:33 27 4
gpt4 key购买 nike

因为这个问题已经有些年头了 Is C++20 'char8_t' the same as our old 'char'?

我想知道,现在处理 char8_t 和 char 转换的推荐方法是什么? boost::nowide (1.80.0) 还不理解 char8_t 或 (AFAIK) boost::locale。

作为Tom Honermann注意到

reinterpret_cast<const char   *>(u8"text"); // Ok.
reinterpret_cast<const char8_t*>("text"); // Undefined behavior.

所以:如果我的应用程序“默认”字符串类型是 std,我如何与仅接受 const char*const wchar_t*(想想 Win32 API)的 API 交互::u8string?推荐好像是https://utf8everywhere.org/ .

如果我得到一个 std::u8string 并通过以下方式转换为 std::string

std::u8string convert(std::string str)
{
return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}
std::string convert(std::u8string str)
{
return std::string(reinterpret_cast<const char_t*>(str.data()), str.size());
}

这将调用与 Tom Honermann 相同的 UB提及。这将在我与 Win32 API 或任何其他需要一些 const char* 或返回一些 const char* 的 API 交谈时使用。我可以通过 boost::nowide 进行所有转换,但最后我从 boost::nowide::narrow() 得到一个 const char*我需要施放。

目前的建议是只停留在 char 而忽略 char8_t 吗?

最佳答案

This would invoke the same UB that Tom Honermann mentioned.

正如您提到的帖子中所指出的,UB 仅在您从 char* 转换为 char8_t* 时发生。另一个方向也可以。

如果给定一个以 UTF-8 编码的 char*(并且出于某种原因您希望避免只进行转换的 UB),您可以使用 std: :transform 通过转换字符将 char 转换为 char8_t:

std::u8string convert(std::string str)
{
std::u8string ret(str.size());
std::ranges::transform(str, ret.begin(), [](char c) {return char8_t(c);});
return ret;
}

C++23 的 ranges::to 将不再需要使用命名的返回变量。

为了处理 wchar_t 接口(interface)(你不应该这样做,因为现在是 UTF-8 support exists through narrow character interfaces on Windows ),你必须进行实际的 UTF-8->UTF-16 转换。 无论如何您都必须这样做。

关于c++ - char8_t 和 utf8everywhere : How to convert to const char* APIs without invoking undefined behaviour?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74344350/

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