42 size_t avail =
s.size();
43 const char *ptr =
s.data();
49 if ((*ptr & 0x80) == 0)
54 else if ((*ptr & 0xe0) == 0xc0)
57 throw std::runtime_error(
"Invalid UTF-8");
58 cp = (*ptr++ & 0x1f) << 6;
63 else if ((*ptr & 0xf0) == 0xe0)
66 throw std::runtime_error(
"Invalid UTF-8");
67 cp = (*ptr++ & 0xf) << 12;
68 cp |= (*ptr++ & 0x3f) << 6;
73 else if ((*ptr & 0xf8) == 0xf0)
76 throw std::runtime_error(
"Invalid UTF-8");
77 cp = (*ptr++ & 0x7) << 18;
78 cp |= (*ptr++ & 0x3f) << 12;
79 cp |= (*ptr++ & 0x3f) << 6;
85 throw std::runtime_error(
"Invalid UTF-8");
92 else if (cp <= 0xffff)
94 else if (cp <= 0x10ffff)
97 throw std::runtime_error(
"Invalid code point UTF-8 transformation");
102 case 1: *wptr++ = cp;
break;
103 case 2: *wptr++ = 0xc0 | (cp >> 6); *wptr++ = 0x80 | (cp & 0x3f);
break;
104 case 3: *wptr++ = 0xe0 | (cp >> 12); *wptr++ = 0x80 | ((cp >> 6) & 0x3f); *wptr++ = 0x80 | (cp & 0x3f);
break;
105 case 4: *wptr++ = 0xf0 | (cp >> 18); *wptr++ = 0x80 | ((cp >> 12) & 0x3f); *wptr++ = 0x80 | ((cp >> 6) & 0x3f); *wptr++ = 0x80 | (cp & 0x3f);
break;
106 default:
throw std::runtime_error(
"Invalid UTF-8");
109 sc.append(wbuf, bytes);