21 # include <util/pragma_push.def>
23 # pragma warning(disable : 4668)
25 # pragma warning(disable : 5039)
28 # include <util/pragma_pop.def>
38 int slength =
static_cast<int>(wcslen(s));
40 WideCharToMultiByte(CP_UTF8, 0, s, slength, NULL, 0, NULL, NULL);
41 std::string
r(rlength, 0);
42 WideCharToMultiByte(CP_UTF8, 0, s, slength, &
r[0], rlength, NULL, NULL);
46 return narrow(std::wstring(s));
50 std::wstring
widen(
const char *s)
54 int slength =
static_cast<int>(strlen(s));
55 int rlength = MultiByteToWideChar(CP_UTF8, 0, s, slength, NULL, 0);
56 std::wstring
r(rlength, 0);
57 MultiByteToWideChar(CP_UTF8, 0, s, slength, &
r[0], rlength);
61 return widen(std::string(s));
65 std::string
narrow(
const std::wstring &s)
69 int slength =
static_cast<int>(s.size());
71 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, NULL, 0, NULL, NULL);
72 std::string
r(rlength, 0);
73 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, &
r[0], rlength, NULL, NULL);
79 result.reserve(s.size());
81 for(
const auto codepoint : s)
88 std::wstring
widen(
const std::string &s)
92 int slength =
static_cast<int>(s.size());
93 int rlength = MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, NULL, 0);
94 std::wstring
r(rlength, 0);
95 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, &
r[0], rlength);
102 r.reserve(utf32.size());
103 for(
auto codepoint : utf32)
114 result +=
static_cast<char>(c);
117 result +=
static_cast<char>((c >> 6) | 0xc0);
118 result +=
static_cast<char>((c & 0x3f) | 0x80);
122 result +=
static_cast<char>((c >> 12) | 0xe0);
123 result +=
static_cast<char>(((c >> 6) & 0x3f) | 0x80);
124 result +=
static_cast<char>((c & 0x3f) | 0x80);
128 result +=
static_cast<char>((c >> 18) | 0xf0);
129 result +=
static_cast<char>(((c >> 12) & 0x3f) | 0x80);
130 result +=
static_cast<char>(((c >> 6) & 0x3f) | 0x80);
131 result +=
static_cast<char>((c & 0x3f) | 0x80);
142 result.reserve(s.size());
144 for(
const auto c : s)
150 std::vector<std::string>
narrow_argv(
int argc,
const wchar_t **argv_wide)
152 if(argv_wide ==
nullptr)
153 return std::vector<std::string>();
155 std::vector<std::string> argv_narrow;
156 argv_narrow.reserve(argc);
158 for(
int i = 0; i != argc; ++i)
159 argv_narrow.push_back(
narrow(argv_wide[i]));
172 result +=
static_cast<wchar_t>(code);
181 code = code - 0x10000;
182 const uint16_t i1 =
static_cast<uint16_t
>(((code >> 10) & 0x3ff) | 0xD800);
183 result +=
static_cast<wchar_t>(i1);
184 const uint16_t i2 =
static_cast<uint16_t
>((code & 0x3ff) | 0xDC00);
185 result +=
static_cast<wchar_t>(i2);
196 result.reserve(in.size());
209 std::u32string result;
210 result.reserve(utf8_str.size());
212 while(i < utf8_str.size())
214 unsigned char c = utf8_str[i++];
224 else if(c <= 0xDF && i < utf8_str.size())
229 code = (c & 0x1Fu) << 6;
233 else if(c <= 0xEF && i + 1 < utf8_str.size())
235 code = (c & 0xFu) << 12;
237 code += (c & 0x3Fu) << 6;
241 else if(c <= 0xF7 && i + 2 < utf8_str.size())
243 code = (c & 0x7u) << 18;
245 code += (c & 0x3Fu) << 12;
247 code += (c & 0x3Fu) << 6;
260 result.append(1, code);
276 std::ostringstream &result,
277 const std::locale &loc)
294 else if(ch <= 255 && isprint(ch, loc))
296 const auto uch =
static_cast<unsigned char>(ch);
299 if(uch ==
'"' || uch ==
'\\')
307 result <<
"\\u" << std::hex << std::setw(4) << std::setfill(
'0')
308 <<
static_cast<unsigned int>(ch);
320 std::ostringstream &result,
321 const std::locale &loc)
323 if(ch == (
wchar_t)
'\'')
325 const auto uch =
static_cast<unsigned char>(ch);
327 result <<
'\\' << uch;
339 std::ostringstream result;
340 const std::locale loc;
354 std::ostringstream result;
355 const std::locale loc;
356 for(
const auto ch : in)
371 std::wstring wide_string(utf16_str.begin(), utf16_str.end());
372 return std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,
wchar_t>{}
373 .to_bytes(wide_string);
375 return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}
376 .to_bytes(utf16_str);
383 return std::strtol(hex.c_str(),
nullptr, 16);