#include #include #include #include #include #include #include using std::cout; using std::endl; using std::exit; using std::memcmp; using std::size_t; using std::wcout; int main(void) { constexpr char16_t msg_utf16[] = u"¡Hola, mundo! \U0001F600"; // Shouldn't assume endianness. constexpr wchar_t msg_w[] = L"¡Hola, mundo! \U0001F600"; constexpr char32_t msg_utf32[] = U"¡Hola, mundo! \U0001F600"; constexpr char msg_utf8[] = u8"¡Hola, mundo! \U0001F600"; // May vary from OS to OS> "" is the most standard, but might require, e.g. "en_US.utf8". constexpr char locale_name[] = ""; std::locale::global(std::locale(locale_name)); // wcout.imbue(std::locale()); const std::codecvt_utf16 converter_w; const size_t max_len = sizeof(msg_utf16); std::vector out(max_len); std::mbstate_t state; const wchar_t* from_w = nullptr; char* to_next = nullptr; converter_w.out( state, msg_w, msg_w+sizeof(msg_w)/sizeof(wchar_t), from_w, out.data(), out.data() + out.size(), to_next ); if (memcmp( msg_utf8, out.data(), sizeof(msg_utf8) ) == 0 ) { wcout << L"std::codecvt_utf16 converts to UTF-8, not UTF-16!" << endl; } else if ( memcmp( msg_utf16, out.data(), max_len ) != 0 ) { wcout << L"std::codecvt_utf16 conversion not equal!" << endl; } else { wcout << L"std::codecvt_utf16 conversion is correct." << endl; } out.clear(); out.resize(max_len); const std::codecvt_utf16 converter_u32; const char32_t* from_u32 = nullptr; converter_u32.out( state, msg_utf32, msg_utf32+sizeof(msg_utf32)/sizeof(char32_t), from_u32, out.data(), out.data() + out.size(), to_next ); if ( memcmp( msg_utf16, out.data(), max_len ) != 0 ) { wcout << L"std::codecvt_utf16 conversion not equal!" << endl; } else { wcout << L"std::codecvt_utf16 conversion is correct." << endl; } wcout << msg_w << endl; return EXIT_SUCCESS; }