让我们看看我是否可以在没有太多事实错误的情况下进行解释...
我正在编写一个字符串类,并且希望它使用utf-8
(存储在std :: string中)作为内部存储。我希望它既可以接受“正常”std::string
又std::wstring
可以接受输入和输出。
使用std :: wstring没问题,我可以std::codecvt_utf8<wchar_t>
用来将std :: wstring都转换为。
但是,经过广泛的谷歌搜索和搜索之后,我还没有找到在“正常/默认” C ++ std :: string(我假设在Windows中使用本地系统本地化吗)和utf-8 std之间转换的方法: :串。
我猜一个选择是先使用以下方法将std :: string转换为std :: wstring std::codecvt<wchar_t, char>
,然后如上所述将其转换为utf-8,但这似乎效率很低,因为至少应该将char的前128个值转换为如果我理解正确的话,可以直接转换为utf-8,无需进行任何转换,而无需考虑本地化。
我发现了一个类似的问题:C ++:如何将ASCII或ANSI转换为UTF8并存储在std :: string中尽管我对此答案有些怀疑,因为它很难编码为拉丁文1,并且我希望它可以与所有类型的拉丁文一起使用。本地化是安全的。
没有涉及boost的答案,我不想让我的代码库与之一起工作。
如果您的“普通字符串”是使用系统的代码页编码的,并且您想将其转换为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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句