#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main()
{
// UTF-8 data. The character U+1d10b, musical sign segno, does not fit in UCS2
std::string utf8 = u8"z\u6c34\U0001d10b";
// the UTF-8 / UTF-16 standard conversion facet
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;
std::u16string utf16 = utf16conv.from_bytes(utf8);
std::cout << "UTF16 conversion produced " << utf16.size() << " code points:\n";
for(char16_t c : utf16)
std::cout << std::hex << std::showbase << c << '\n';
// the UTF-8 / UCS2 standard conversion facet
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv;
try {
std::u16string ucs2 = ucs2conv.from_bytes(utf8);
} catch(const std::range_error& e) {
std::u16string ucs2 = ucs2conv.from_bytes(utf8.substr(0, ucs2conv.converted()));
std::cout << "UCS2 failed after producing " << std::dec << ucs2.size()<<" characters:\n";
for(char16_t c : ucs2)
std::cout << std::hex << std::showbase << c << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bG9jYWxlPgojaW5jbHVkZSA8Y29kZWN2dD4KaW50IG1haW4oKQp7CiAgICAvLyBVVEYtOCBkYXRhLiBUaGUgY2hhcmFjdGVyIFUrMWQxMGIsIG11c2ljYWwgc2lnbiBzZWdubywgZG9lcyBub3QgZml0IGluIFVDUzIKICAgIHN0ZDo6c3RyaW5nIHV0ZjggPSB1OCJ6XHU2YzM0XFUwMDAxZDEwYiI7CiAKICAgIC8vIHRoZSBVVEYtOCAvIFVURi0xNiBzdGFuZGFyZCBjb252ZXJzaW9uIGZhY2V0CiAgICBzdGQ6OndzdHJpbmdfY29udmVydDxzdGQ6OmNvZGVjdnRfdXRmOF91dGYxNjxjaGFyMTZfdD4sIGNoYXIxNl90PiB1dGYxNmNvbnY7CiAgICBzdGQ6OnUxNnN0cmluZyB1dGYxNiA9IHV0ZjE2Y29udi5mcm9tX2J5dGVzKHV0ZjgpOwogICAgc3RkOjpjb3V0IDw8ICJVVEYxNiBjb252ZXJzaW9uIHByb2R1Y2VkICIgPDwgdXRmMTYuc2l6ZSgpIDw8ICIgY29kZSBwb2ludHM6XG4iOwogICAgZm9yKGNoYXIxNl90IGMgOiB1dGYxNikKICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgc3RkOjpzaG93YmFzZSA8PCBjIDw8ICdcbic7CiAKICAgIC8vIHRoZSBVVEYtOCAvIFVDUzIgc3RhbmRhcmQgY29udmVyc2lvbiBmYWNldAogICAgc3RkOjp3c3RyaW5nX2NvbnZlcnQ8c3RkOjpjb2RlY3Z0X3V0Zjg8Y2hhcjE2X3Q+LCBjaGFyMTZfdD4gdWNzMmNvbnY7CiAgICB0cnkgewogICAgICAgIHN0ZDo6dTE2c3RyaW5nIHVjczIgPSB1Y3MyY29udi5mcm9tX2J5dGVzKHV0ZjgpOwogICAgfSBjYXRjaChjb25zdCBzdGQ6OnJhbmdlX2Vycm9yJiBlKSB7CiAgICAgICAgc3RkOjp1MTZzdHJpbmcgdWNzMiA9IHVjczJjb252LmZyb21fYnl0ZXModXRmOC5zdWJzdHIoMCwgdWNzMmNvbnYuY29udmVydGVkKCkpKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlVDUzIgZmFpbGVkIGFmdGVyIHByb2R1Y2luZyAiIDw8IHN0ZDo6ZGVjIDw8IHVjczIuc2l6ZSgpPDwiIGNoYXJhY3RlcnM6XG4iOwogICAgICAgIGZvcihjaGFyMTZfdCBjIDogdWNzMikKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2hvd2Jhc2UgPDwgYyA8PCAnXG4nOwogICAgfQp9