47 lines
1.2 KiB
C++
47 lines
1.2 KiB
C++
// ArduinoJson - arduinojson.org
|
|
// Copyright Benoit Blanchon 2014-2020
|
|
// MIT License
|
|
|
|
#pragma once
|
|
|
|
#include <ArduinoJson/Namespace.hpp>
|
|
|
|
namespace ARDUINOJSON_NAMESPACE {
|
|
|
|
namespace Utf8 {
|
|
template <typename TStringBuilder>
|
|
inline void encodeCodepoint(uint32_t codepoint32, TStringBuilder& str) {
|
|
// this function was optimize for code size on AVR
|
|
|
|
// a buffer to store the string in reverse
|
|
char buf[5];
|
|
char* p = buf;
|
|
|
|
*(p++) = 0;
|
|
if (codepoint32 < 0x80) {
|
|
*(p++) = char((codepoint32));
|
|
} else {
|
|
*(p++) = char((codepoint32 | 0x80) & 0xBF);
|
|
uint16_t codepoint16 = uint16_t(codepoint32 >> 6);
|
|
if (codepoint16 < 0x20) { // 0x800
|
|
*(p++) = char(codepoint16 | 0xC0);
|
|
} else {
|
|
*(p++) = char((codepoint16 | 0x80) & 0xBF);
|
|
codepoint16 = uint16_t(codepoint16 >> 6);
|
|
if (codepoint16 < 0x10) { // 0x10000
|
|
*(p++) = char(codepoint16 | 0xE0);
|
|
} else {
|
|
*(p++) = char((codepoint16 | 0x80) & 0xBF);
|
|
codepoint16 = uint16_t(codepoint16 >> 6);
|
|
*(p++) = char(codepoint16 | 0xF0);
|
|
}
|
|
}
|
|
}
|
|
|
|
while (*(--p)) {
|
|
str.append(*p);
|
|
}
|
|
}
|
|
} // namespace Utf8
|
|
} // namespace ARDUINOJSON_NAMESPACE
|