8#include <botan/internal/charset.h>
9#include <botan/internal/loadstor.h>
10#include <botan/exceptn.h>
17void append_utf8_for(std::string& s, uint32_t c)
19 if(c >= 0xD800 && c < 0xE000)
20 throw Decoding_Error(
"Invalid Unicode character");
24 const uint8_t b0 =
static_cast<uint8_t
>(c);
25 s.push_back(
static_cast<char>(b0));
29 const uint8_t b0 = 0xC0 |
static_cast<uint8_t
>(c >> 6);
30 const uint8_t b1 = 0x80 |
static_cast<uint8_t
>(c & 0x3F);
31 s.push_back(
static_cast<char>(b0));
32 s.push_back(
static_cast<char>(b1));
36 const uint8_t b0 = 0xE0 |
static_cast<uint8_t
>(c >> 12);
37 const uint8_t b1 = 0x80 |
static_cast<uint8_t
>((c >> 6) & 0x3F);
38 const uint8_t b2 = 0x80 |
static_cast<uint8_t
>(c & 0x3F);
39 s.push_back(
static_cast<char>(b0));
40 s.push_back(
static_cast<char>(b1));
41 s.push_back(
static_cast<char>(b2));
43 else if(c <= 0x10FFFF)
45 const uint8_t b0 = 0xF0 |
static_cast<uint8_t
>(c >> 18);
46 const uint8_t b1 = 0x80 |
static_cast<uint8_t
>((c >> 12) & 0x3F);
47 const uint8_t b2 = 0x80 |
static_cast<uint8_t
>((c >> 6) & 0x3F);
48 const uint8_t b3 = 0x80 |
static_cast<uint8_t
>(c & 0x3F);
49 s.push_back(
static_cast<char>(b0));
50 s.push_back(
static_cast<char>(b1));
51 s.push_back(
static_cast<char>(b2));
52 s.push_back(
static_cast<char>(b3));
55 throw Decoding_Error(
"Invalid Unicode character");
66 const size_t chars = len / 2;
69 for(
size_t i = 0; i != chars; ++i)
72 append_utf8_for(s, c);
83 const size_t chars = len / 4;
86 for(
size_t i = 0; i != chars; ++i)
89 append_utf8_for(s, c);
101 for(
size_t i = 0; i != len; ++i)
103 const uint32_t c =
static_cast<uint8_t
>(chars[i]);
104 append_utf8_for(s, c);
111 std::ostringstream oss;
121 else if(
static_cast<unsigned char>(c) >= 128)
123 unsigned char z =
static_cast<unsigned char>(c);
124 oss <<
"\\x" << std::hex << std::uppercase << static_cast<int>(z);
std::string format_char_for_display(char c)
std::string ucs2_to_utf8(const uint8_t ucs2[], size_t len)
constexpr uint32_t load_be< uint32_t >(const uint8_t in[], size_t off)
constexpr uint16_t load_be< uint16_t >(const uint8_t in[], size_t off)
std::string latin1_to_utf8(const uint8_t chars[], size_t len)
std::string ucs4_to_utf8(const uint8_t ucs4[], size_t len)