让我们看看我是否可以在没有太多事实错误的情况下解释这一点......
我正在写一个字符串类,我希望它使用utf-8
(存储在std :: string中)作为它的内部存储.我希望它能够兼顾"正常" std::string
和std::wstring
输入输出.
使用std :: wstring不是问题,我可以std::codecvt_utf8
用来转换和转换为std :: wstring.
然而,经过广泛的谷歌搜索和搜索SO我还没有找到一种方法来转换"正常/默认"C++ std :: string(我假设在Windows中使用本地系统本地化?)和utf-8标准: :串.
我想一个选择是首先将std :: string转换为std :: wstring std::codecvt
,然后将其转换为utf-8,但是这看起来非常低效,因为至少char的前128个值应该翻译如果我理解正确,无论本地化如何,直接转到utf-8而不进行转换.
我发现了类似的问题:C++:如何将ASCII或ANSI转换为UTF8并存储在std :: string中 虽然我对这个答案有点怀疑,因为它很难编码为latin 1而我希望这适用于所有类型的本地化是安全的.
没有答案涉及提升感谢,我不希望让我的代码库使用它的头痛.
如果您的"普通字符串"使用系统的代码页编码,并且您想将其转换为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);