8#include <botan/charset.h>
9#include <botan/exceptn.h>
10#include <botan/loadstor.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);
103 while(position != utf8.size())
105 const uint8_t c1 =
static_cast<uint8_t
>(utf8[position++]);
109 iso8859 +=
static_cast<char>(c1);
111 else if(c1 >= 0xC0 && c1 <= 0xC7)
113 if(position == utf8.size())
116 const uint8_t c2 =
static_cast<uint8_t
>(utf8[position++]);
117 const uint8_t iso_char = ((c1 & 0x07) << 6) | (c2 & 0x3F);
122 iso8859 +=
static_cast<char>(iso_char);
138std::string ucs2_to_latin1(
const std::string& ucs2)
140 if(ucs2.size() % 2 == 1)
145 for(
size_t i = 0; i != ucs2.size(); i += 2)
147 const uint8_t c1 = ucs2[i];
148 const uint8_t c2 = ucs2[i+1];
153 latin1 +=
static_cast<char>(c2);
162std::string latin1_to_utf8(
const std::string& iso8859)
165 for(
size_t i = 0; i != iso8859.size(); ++i)
167 const uint8_t c =
static_cast<uint8_t
>(iso8859[i]);
170 utf8 +=
static_cast<char>(c);
173 utf8 +=
static_cast<char>((0xC0 | (c >> 6)));
174 utf8 +=
static_cast<char>((0x80 | (c & 0x3F)));
197 return latin1_to_utf8(str);
201 return ucs2_to_latin1(str);
212 if(c ==
'0' || c ==
'1' || c ==
'2' || c ==
'3' || c ==
'4' ||
213 c ==
'5' || c ==
'6' || c ==
'7' || c ==
'8' || c ==
'9')
223 if(c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\r')
277 return (std::tolower(
static_cast<unsigned char>(a)) ==
278 std::tolower(
static_cast<unsigned char>(b)));
std::string to_string(const BER_Object &obj)
std::string transcode(const std::string &str, Character_Set to, Character_Set from)
bool caseless_cmp(char a, char b)
uint8_t char2digit(char c)
char digit2char(uint8_t b)
std::string ucs4_to_utf8(const uint8_t ucs4[], size_t len)
std::string ucs2_to_utf8(const uint8_t ucs2[], size_t len)
std::string utf8_to_latin1(const std::string &utf8)
uint32_t load_be< uint32_t >(const uint8_t in[], size_t off)
uint16_t load_be< uint16_t >(const uint8_t in[], size_t off)