使用C ++ 11可以轻松地在编码之间进行转换,并且大多数编译器都可以通过<codecvt>和<locale>标头以跨平台的方式处理编码。
#include <iostream> #include <codecvt> #include <locale> #include <string> using namespace std; int main() { // 在wstring和utf8字符串之间转换 wstring_convert<codecvt_utf8_utf16<wchar_t>> wchar_to_utf8; // 在u16string和utf8字符串之间转换 wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> utf16_to_utf8; wstring wstr = L"foobar"; string utf8str = wchar_to_utf8.to_bytes(wstr); wstring wstr2 = wchar_to_utf8.from_bytes(utf8str); wcout << wstr << endl; cout << utf8str << endl; wcout << wstr2 << endl; u16string u16str = u"foobar"; string utf8str2 = utf16_to_utf8.to_bytes(u16str); u16string u16str2 = utf16_to_utf8.from_bytes(utf8str2); return 0; }
请注意,Visual Studio 2015提供了对这些转换的支持,但是它们的库实现中的错误要求wstring_convert在处理以下内容时使用不同的模板char16_t:
using utf16_char = unsigned short; wstring_convert<codecvt_utf8_utf16<utf16_char>, utf16_char> conv_utf8_utf16; void strings::utf16_to_utf8(const std::u16string& utf16, std::string& utf8) { std::basic_string<utf16_char> tmp; tmp.resize(utf16.length()); std::copy(utf16.begin(), utf16.end(), tmp.begin()); utf8 = conv_utf8_utf16.to_bytes(tmp); } void strings::utf8_to_utf16(const std::string& utf8, std::u16string& utf16) { std::basic_string<utf16_char> tmp = conv_utf8_utf16.from_bytes(utf8); utf16.clear(); utf16.resize(tmp.length()); std::copy(tmp.begin(), tmp.end(), utf16.begin()); }