将“normal”std :: string转换为utf-8

让我们来看看是否可以解释这个没有太多的事实错误…

我正在写一个string类,我想它使用utf-8 (存储在一个std ::string),因为它是内部存储。 我希望它能够将“正常”的std::stringstd::wstring作为input和输出。

使用std :: wstring不是一个问题,我可以使用std::codecvt_utf8<wchar_t>将std :: wstring同时转换为std :: wstring。

然而,广泛的search和search后,我还没有find一种方法来转换“正常/默认”C + + std ::string(我假设在Windows使用本地系统本地化?)和utf-8标准: :串。

我想一个select是首先将std :: string转换为std :: wstring,使用std::codecvt<wchar_t, char> ,然后将其转换为utf-8,但是这样看起来相当低效,因为至less如果我理解正确的话,char的前128个值应该直接转换为utf-8而不用转换。

我发现这个类似的问题: C ++:如何将ASCII或ANSI转换为UTF8并存储在std :: string虽然我对这个答案有点怀疑,因为它被硬编码为拉丁文1,我希望这与所有types的本地化是安全的一面。

没有答案涉及提升谢谢,我不想让我的代码库的工作与它的头痛。

Solutions Collecting From Web of "将“normal”std :: string转换为utf-8"

如果你的“正常字符串”使用系统的代码页进行编码,并且你想把它转换为UTF-8,那么这应该工作:

 std::string codepage_str; int size = MultiByteToWideChar(CP_ACP, MB_COMPOSITE, codepage_str.c_str(), codepage_str.length(), nullptr, 0); std::wstring utf16_str(size, '\0'); MultiByteToWideChar(CP_ACP, MB_COMPOSITE, codepage_str.c_str(), codepage_str.length(), &utf16_str[0], size); int utf8_size = WideCharToMultiByte(CP_UTF8, 0, utf16_str.c_str(), utf16_str.length(), nullptr, 0, nullptr, nullptr); std::string utf8_str(utf8_size, '\0'); WideCharToMultiByte(CP_UTF8, 0, utf16_str.c_str(), utf16_str.length(), &utf8_str[0], utf8_size, nullptr, nullptr);