将"normal"std :: string转换为utf-8

Dae*_*pha 13 c++ windows localization utf-8 visual-studio-2010

让我们看看我是否可以在没有太多事实错误的情况下解释这一点......

我正在写一个字符串类,我希望它使用utf-8(存储在std :: string中)作为它的内部存储.我希望它能够兼顾"正常" std::stringstd::wstring输入输出.

使用std :: wstring不是问题,我可以std::codecvt_utf8<wchar_t>用来转换和转换为std :: wstring.

然而,经过广泛的谷歌搜索和搜索SO我还没有找到一种方法来转换"正常/默认"C++ std :: string(我假设在Windows中使用本地系统本地化?)和utf-8标准: :串.

我想一个选择是首先将std :: string转换为std :: wstring std::codecvt<wchar_t, char>,然后将其转换为utf-8,但是这看起来非常低效,因为至少char的前128个值应该翻译如果我理解正确,无论本地化如何,直接转到utf-8而不进行转换.

我发现了类似的问题:C++:如何将ASCII或ANSI转换为UTF8并存储在std :: string中 虽然我对这个答案有点怀疑,因为它很难编码为latin 1而我希望这适用于所有类型的本地化是安全的.

没有答案涉及提升感谢,我不希望让我的代码库使用它的头痛.

Sim*_*ple 18

如果您的"普通字符串"使用系统的代码页编码,并且您想将其转换为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);
Run Code Online (Sandbox Code Playgroud)