39 static const unsigned char firstByteMark[] = { 0x00, 0x00, 0xC0, 0xE0 };
40 static const unsigned unicodevalues[] = {
41 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
42 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
43 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
44 0xFFFD, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
45 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
46 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
47 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
48 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457
56 const auto ch =
static_cast<unsigned char>(*in);
58 size_t bytesToWrite = 0;
59 char sequence[4] = {0, 0, 0, 0};
61 static_assert(std::numeric_limits<unsigned char>::max() == 0xFFu,
62 "we require char to be exactly 8 bits");
68 u = unicodevalues[ch - 0x80];
77 switch (bytesToWrite) {
79 sequence[2] =
static_cast<char>(u & 0x3f) | 0x80;
83 sequence[1] =
static_cast<char>(u & 0x3f) | 0x80;
87 sequence[0] =
static_cast<char>(u) | firstByteMark[bytesToWrite];
89 result.
append(sequence, bytesToWrite);