如何将 UTF-8 编码的 std::string 转换为 UTF-16 std::string

How to convert UTF-8 encoded std::string to UTF-16 std::string

本文关键字:std string UTF-16 转换 UTF-8 编码      更新时间:2023-10-16

如何将 UTF-8 编码的 std::string 转换为 UTF-16 std::string?可能吗?

不,我不能在我的情况下使用 std::wstring。

视窗,MSVC-11.0。

像这样尝试怎么样:-

std::string s = u8"Your string";
// #include <codecvt>
std::wstring_convert<std::codecvt<char16_t,char,std::mbstate_t>,char16_t> convert;
std::u16string u16 = convert.from_bytes(s);
std::string u8 = convert.to_bytes(u16);

还要检查此 UTF 到 UTF 的转换。

从文档中:-

专用化编解码器在 UTF-16 和 UTF-8 编码方案及其专业化 编解码器在 UTF-32 和 UTF-8 编码方案。

我在尝试使用Visual Studio时遇到了数十个这样的问题,然后就放弃了。 在使用 std::wstring 的转换和使用 std::codecvt 进行转换时,存在一个已知问题。

请看这里:将C++标准::字符串转换为 UTF-16-LE 编码字符串

我为解决问题所做的工作是从使用 iconv 库的善意海报的代码中复制的。 然后我所要做的就是调用 convert(my_str, strlen(my_str), &used_bytes),其中 my_str 是一个 char[],strlen(my_str) 是它的长度,size_t used_bytes = strlen(my_str)*3; 我只是给了它足够的字节来使用。 在该函数中,您可以更改 foo = iconv_open("UTF-16", "UTF-8"iconv_t),在上面的函数中调查 setlocale() 并创建传递给 iconv_open() 的 enc 字符串,该函数在上面的链接中处于所有荣耀中。

这个陷阱正在编译和使用iconv,它几乎期望在Windows上Cygwin或类似的东西,但你可以在Visual Studio上使用它。 https://github.com/win-iconv/win-iconv 有一个纯粹的Win32 libiconv,可能适合您的需求。

我会说给iconv一个尝试,看看它在一个简短的测试程序中是如何进行的。 祝你好运!