33 #include <string_view> 40 template <
class Label>
42 for (
const unsigned char ch : str) labels->push_back(ch);
52 template <
class Label>
54 for (
auto it = str.begin(); it != str.end();) {
57 if ((c & 0x80) == 0) {
60 if ((c & 0xc0) == 0x80) {
61 LOG(ERROR) <<
"UTF8StringToLabels: Continuation byte as lead byte";
65 (c >= 0xc0) + (c >= 0xe0) + (c >= 0xf0) + (c >= 0xf8) + (c >= 0xfc);
66 int32_t label = c & ((1 << (6 - count)) - 1);
68 if (it == str.end()) {
69 LOG(ERROR) <<
"UTF8StringToLabels: Truncated UTF-8 byte sequence";
74 if ((cb & 0xc0) != 0x80) {
75 LOG(ERROR) <<
"UTF8StringToLabels: Missing/invalid continuation byte";
78 label = (label << 6) | (cb & 0x3f);
83 LOG(ERROR) <<
"UTF8StringToLabels: Invalid character found: " << c;
86 labels->push_back(label);
92 template <
class Label>
94 std::ostringstream ostrm;
95 for (
const char label : labels) {
96 if (label != 0) ostrm << label;
102 template <
class Label>
104 std::ostringstream ostrm;
105 for (
const int32_t label : labels) {
107 LOG(ERROR) <<
"LabelsToUTF8String: Invalid character found: " << label;
109 }
else if (label == 0) {
111 }
else if (label < 0x80) {
112 ostrm << static_cast<char>(label);
113 }
else if (label < 0x800) {
114 ostrm << static_cast<char>((label >> 6) | 0xc0);
115 ostrm << static_cast<char>((label & 0x3f) | 0x80);
116 }
else if (label < 0x10000) {
117 ostrm << static_cast<char>((label >> 12) | 0xe0);
118 ostrm << static_cast<char>(((label >> 6) & 0x3f) | 0x80);
119 ostrm << static_cast<char>((label & 0x3f) | 0x80);
120 }
else if (label < 0x200000) {
121 ostrm << static_cast<char>((label >> 18) | 0xf0);
122 ostrm << static_cast<char>(((label >> 12) & 0x3f) | 0x80);
123 ostrm << static_cast<char>(((label >> 6) & 0x3f) | 0x80);
124 ostrm << static_cast<char>((label & 0x3f) | 0x80);
125 }
else if (label < 0x4000000) {
126 ostrm << static_cast<char>((label >> 24) | 0xf8);
127 ostrm << static_cast<char>(((label >> 18) & 0x3f) | 0x80);
128 ostrm << static_cast<char>(((label >> 12) & 0x3f) | 0x80);
129 ostrm << static_cast<char>(((label >> 6) & 0x3f) | 0x80);
130 ostrm << static_cast<char>((label & 0x3f) | 0x80);
132 ostrm << static_cast<char>((label >> 30) | 0xfc);
133 ostrm << static_cast<char>(((label >> 24) & 0x3f) | 0x80);
134 ostrm << static_cast<char>(((label >> 18) & 0x3f) | 0x80);
135 ostrm << static_cast<char>(((label >> 12) & 0x3f) | 0x80);
136 ostrm << static_cast<char>(((label >> 6) & 0x3f) | 0x80);
137 ostrm << static_cast<char>((label & 0x3f) | 0x80);
bool UTF8StringToLabels(std::string_view str, std::vector< Label > *labels)
bool LabelsToUTF8String(const std::vector< Label > &labels, std::string *str)
bool ByteStringToLabels(std::string_view str, std::vector< Label > *labels)
bool LabelsToByteString(const std::vector< Label > &labels, std::string *str)