25 int slength=
static_cast<int>(wcslen(s));
27 WideCharToMultiByte(CP_UTF8, 0, s, slength, NULL, 0, NULL, NULL);
28 std::string
r(rlength, 0);
29 WideCharToMultiByte(CP_UTF8, 0, s, slength, &
r[0], rlength, NULL, NULL);
38 r+=
static_cast<char>(*s);
46 std::wstring
widen(
const char *s)
50 int slength=
static_cast<int>(strlen(s));
52 MultiByteToWideChar(CP_UTF8, 0, s, slength, NULL, 0);
53 std::wstring
r(rlength, 0);
54 MultiByteToWideChar(CP_UTF8, 0, s, slength, &
r[0], rlength);
71 std::string
narrow(
const std::wstring &s)
75 int slength=
static_cast<int>(s.size());
77 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, NULL, 0, NULL, NULL);
78 std::string
r(rlength, 0);
79 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, &
r[0], rlength, NULL, NULL);
84 return std::string(s.begin(), s.end());
88 std::wstring
widen(
const std::string &s)
92 int slength=
static_cast<int>(s.size());
94 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, NULL, 0);
95 std::wstring
r(rlength, 0);
96 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, &
r[0], rlength);
101 return std::wstring(s.begin(), s.end());
110 result+=
static_cast<char>(c);
113 result+=
static_cast<char>((c >> 6) | 0xc0);
114 result+=
static_cast<char>((c &0x3f) | 0x80);
118 result+=
static_cast<char>((c >> 12) | 0xe0);
119 result+=
static_cast<char>(((c >> 6) &0x3f) | 0x80);
120 result+=
static_cast<char>((c &0x3f) | 0x80);
124 result+=
static_cast<char>((c >> 18) | 0xf0);
125 result+=
static_cast<char>(((c >> 12) &0x3f)| 0x80);
126 result+=
static_cast<char>(((c >> 6) &0x3f) | 0x80);
127 result+=
static_cast<char>((c &0x3f) | 0x80);
138 result.reserve(s.size());
140 for(
const auto c : s)
146 std::vector<std::string>
narrow_argv(
int argc,
const wchar_t **argv_wide)
148 if(argv_wide==
nullptr)
149 return std::vector<std::string>();
151 std::vector<std::string> argv_narrow;
152 argv_narrow.reserve(argc);
154 for(
int i=0; i!=argc; ++i)
155 argv_narrow.push_back(
narrow(argv_wide[i]));
168 result +=
static_cast<wchar_t>(code);
178 const uint16_t i1 =
static_cast<uint16_t
>(((code >> 10) & 0x3ff) | 0xD800);
179 result +=
static_cast<wchar_t>(i1);
180 const uint16_t i2 =
static_cast<uint16_t
>((code & 0x3ff) | 0xDC00);
181 result +=
static_cast<wchar_t>(i2);
193 result.reserve(in.size());
197 unsigned char c=in[i++];
207 else if(c<=0xDF && i<in.size())
212 code = (c & 0x1Fu) << 6;
216 else if(c<=0xEF && i+1<in.size())
218 code = (c & 0xFu) << 12;
220 code += (c & 0x3Fu) << 6;
224 else if(c<=0xF7 && i+2<in.size())
226 code = (c & 0x7u) << 18;
228 code += (c & 0x3Fu) << 12;
230 code += (c & 0x3Fu) << 6;
255 std::ostringstream &result,
256 const std::locale &
loc)
273 else if(ch <= 255 && isprint(ch,
loc))
275 const auto uch =
static_cast<unsigned char>(ch);
277 if(uch ==
'"' || uch ==
'\\' || uch ==
'\'')
285 result <<
"\\u" << std::hex << std::setw(4) << std::setfill(
'0')
286 <<
static_cast<unsigned int>(ch);
294 std::ostringstream result;
295 const std::locale
loc;
304 std::ostringstream result;
305 const std::locale
loc;
306 for(
const auto ch : in)
std::string narrow(const wchar_t *s)
std::wstring widen(const char *s)
std::wstring utf8_to_utf16_native_endian(const std::string &in)
Convert UTF8-encoded string to UTF-16 with architecture-native endianness.
unsignedbv_typet size_type()
std::string utf32_native_endian_to_utf8(const std::basic_string< unsigned int > &s)
std::vector< std::string > narrow_argv(int argc, const wchar_t **argv_wide)
static void utf16_native_endian_to_java(const wchar_t ch, std::ostringstream &result, const std::locale &loc)
static void utf16_append_code(unsigned int code, std::wstring &result)
static void utf8_append_code(unsigned int c, std::string &result)
Appends a unicode character to a utf8-encoded string.