gpt4 book ai didi

c++ - std::u32string 与 std::string 和 std::u16string 之间的转换

转载 作者:IT王子 更新时间:2023-10-29 01:03:05 65 4
gpt4 key购买 nike

我需要为不同的 API/模块在 UTF-8、UTF-16 和 UTF-32 之间进行转换,因为我知道可以选择使用 C++11,所以我正在查看新的字符串类型。

看起来我可以对 UTF-8、UTF-16 和 UTF-32 使用 stringu16stringu32string。我还找到了 codecvt_utf8codecvt_utf16,它们看起来能够在 charchar16_t 之间进行转换>char32_t 和更高级别的 wstring_convert 但似乎只适用于 bytes/std::string 而不是大量文档。

我是否打算以某种方式对 UTF-16 ↔ UTF-32 和 UTF-8 ↔ UTF-32 情况使用 wstring_convert?我只真正找到了 UTF-8 到 UTF-16 的示例,我什至不确定在 Linux 上是否正确,其中 wchar_t 通常被认为是 UTF-32 ... 或者用这些做一些更复杂的事情直接编解码器?

或者这是否仍未真正处于可用状态,我应该坚持使用我自己现有的使用 8、16 和 32 位无符号整数的小例程?

最佳答案

如果您在 CppReference.com 上阅读 wstring_convert 的文档, codecvt_utf8 , codecvt_utf16 , 和 codecvt_utf8_utf16 , 这些页面包含一个表格,该表格准确地告诉您可以用于各种 UTF 转换的内容。

table

是的,您会使用 std::wstring_convert 方便各种UTF之间的转换。尽管它的名字,它不仅限于 std::wstring , 它实际上与任何 std::basic_string 一起运行类型(std::stringstd::wstringstd::uXXstring 均基于)。

Class template std::wstring_convert performs conversions between byte string std::string and wide string std::basic_string<Elem>, using an individual code conversion facet Codecvt. std::wstring_convert assumes ownership of the conversion facet, and cannot use a facet managed by a locale. The standard facets suitable for use with std::wstring_convert are std::codecvt_utf8 for UTF-8/UCS2 and UTF-8/UCS4 conversions and std::codecvt_utf8_utf16 for UTF-8/UTF-16 conversions.

例如:

typedef std::string u8string;

u8string To_UTF8(const std::u16string &s)
{
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
return conv.to_bytes(s);
}

u8string To_UTF8(const std::u32string &s)
{
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
return conv.to_bytes(s);
}

std::u16string To_UTF16(const u8string &s)
{
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
return conv.from_bytes(s);
}

std::u16string To_UTF16(const std::u32string &s)
{
std::wstring_convert<std::codecvt_utf16<char32_t>, char32_t> conv;
std::string bytes = conv.to_bytes(s);
return std::u16string(reinterpret_cast<const char16_t*>(bytes.c_str()), bytes.length()/sizeof(char16_t));
}

std::u32string To_UTF32(const u8string &s)
{
std::wstring_convert<codecvt_utf8<char32_t>, char32_t> conv;
return conv.from_bytes(s);
}

std::u32string To_UTF32(const std::u16string &s)
{
const char16_t *pData = s.c_str();
std::wstring_convert<std::codecvt_utf16<char32_t>, char32_t> conv;
return conv.from_bytes(reinterpret_cast<const char*>(pData), reinterpret_cast<const char*>(pData+s.length()));
}

关于c++ - std::u32string 与 std::string 和 std::u16string 之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31302506/

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