#include <iostream>
#include <string>
#include <iomanip>
#include <cstdint>
std::string toUTF8(uint32_t cp)
{
char utf8[4];
int len = 0;
if (cp <= 0x007F)
{
utf8[0] = static_cast<char>(cp);
len = 1;
}
else
{
if (cp <= 0x07FF)
{
utf8[0] = 0xC0;
len = 2;
}
else if (cp <= 0xFFFF)
{
utf8[0] = 0xE0;
len = 3;
}
else if (cp <= 0x10FFFF)
{
utf8[0] = 0xF0;
len = 4;
}
else
throw std::invalid_argument("invalid codepoint");
for(int i = 1; i < len; ++i)
{
utf8[len-i] = static_cast<char>(0x80 | (cp & 0x3F));
cp >>= 6;
}
utf8[0] |= static_cast<char>(cp);
}
return std::string(utf8, len);
}
int main()
{
std::string utf8 = toUTF8(210);
std::cout << utf8 << std::endl;
std::cout << std::showbase << std::hex << std::setfill('0') << std::setw(2);
for(unsigned char c : utf8)
std::cout << (c & 0xFF) << ' ';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNzdGRpbnQ+CgpzdGQ6OnN0cmluZyB0b1VURjgodWludDMyX3QgY3ApCnsKICAgIGNoYXIgdXRmOFs0XTsKICAgIGludCBsZW4gPSAwOwoKICAgIGlmIChjcCA8PSAweDAwN0YpCiAgICB7CiAgICAgICAgdXRmOFswXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNwKTsKICAgICAgICBsZW4gPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChjcCA8PSAweDA3RkYpCiAgICAgICAgewogICAgICAgICAgICB1dGY4WzBdID0gMHhDMDsKICAgICAgICAgICAgbGVuID0gMjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY3AgPD0gMHhGRkZGKQogICAgICAgIHsKICAgICAgICAgICAgdXRmOFswXSA9IDB4RTA7CiAgICAgICAgICAgIGxlbiA9IDM7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNwIDw9IDB4MTBGRkZGKQogICAgICAgIHsKICAgICAgICAgICAgdXRmOFswXSA9IDB4RjA7CiAgICAgICAgICAgIGxlbiA9IDQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJpbnZhbGlkIGNvZGVwb2ludCIpOwoKICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgbGVuOyArK2kpCiAgICAgICAgewogICAgICAgICAgICB1dGY4W2xlbi1pXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCAoY3AgJiAweDNGKSk7CiAgICAgICAgICAgIGNwID4+PSA2OwogICAgICAgIH0KCiAgICAgICAgdXRmOFswXSB8PSBzdGF0aWNfY2FzdDxjaGFyPihjcCk7CiAgICB9CgogICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHV0ZjgsIGxlbik7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpzdHJpbmcgdXRmOCA9IHRvVVRGOCgyMTApOwoKCXN0ZDo6Y291dCA8PCB1dGY4IDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzaG93YmFzZSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMik7CiAgICBmb3IodW5zaWduZWQgY2hhciBjIDogdXRmOCkKCSAgICBzdGQ6OmNvdXQgPDwgKGMgJiAweEZGKSA8PCAnICc7CglyZXR1cm4gMDsKfQ==