21 #include <util/pragma_push.def>
23 #pragma warning(disable:4668)
25 #pragma warning(disable : 5039)
29 #include <util/pragma_pop.def>
36 int slength=
static_cast<int>(wcslen(s));
38 WideCharToMultiByte(CP_UTF8, 0, s, slength, NULL, 0, NULL, NULL);
39 std::string
r(rlength, 0);
40 WideCharToMultiByte(CP_UTF8, 0, s, slength, &
r[0], rlength, NULL, NULL);
49 r+=
static_cast<char>(*s);
57 std::wstring
widen(
const char *s)
61 int slength=
static_cast<int>(strlen(s));
63 MultiByteToWideChar(CP_UTF8, 0, s, slength, NULL, 0);
64 std::wstring
r(rlength, 0);
65 MultiByteToWideChar(CP_UTF8, 0, s, slength, &
r[0], rlength);
82 std::string
narrow(
const std::wstring &s)
86 int slength=
static_cast<int>(s.size());
88 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, NULL, 0, NULL, NULL);
89 std::string
r(rlength, 0);
90 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, &
r[0], rlength, NULL, NULL);
95 return std::string(s.begin(), s.end());
99 std::wstring
widen(
const std::string &s)
103 int slength=
static_cast<int>(s.size());
105 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, NULL, 0);
106 std::wstring
r(rlength, 0);
107 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, &
r[0], rlength);
112 return std::wstring(s.begin(), s.end());
121 result+=
static_cast<char>(c);
124 result+=
static_cast<char>((c >> 6) | 0xc0);
125 result+=
static_cast<char>((c &0x3f) | 0x80);
129 result+=
static_cast<char>((c >> 12) | 0xe0);
130 result+=
static_cast<char>(((c >> 6) &0x3f) | 0x80);
131 result+=
static_cast<char>((c &0x3f) | 0x80);
135 result+=
static_cast<char>((c >> 18) | 0xf0);
136 result+=
static_cast<char>(((c >> 12) &0x3f)| 0x80);
137 result+=
static_cast<char>(((c >> 6) &0x3f) | 0x80);
138 result+=
static_cast<char>((c &0x3f) | 0x80);
149 result.reserve(s.size());
151 for(
const auto c : s)
157 std::vector<std::string>
narrow_argv(
int argc,
const wchar_t **argv_wide)
159 if(argv_wide==
nullptr)
160 return std::vector<std::string>();
162 std::vector<std::string> argv_narrow;
163 argv_narrow.reserve(argc);
165 for(
int i=0; i!=argc; ++i)
166 argv_narrow.push_back(
narrow(argv_wide[i]));
179 result +=
static_cast<wchar_t>(code);
189 const uint16_t i1 =
static_cast<uint16_t
>(((code >> 10) & 0x3ff) | 0xD800);
190 result +=
static_cast<wchar_t>(i1);
191 const uint16_t i2 =
static_cast<uint16_t
>((code & 0x3ff) | 0xDC00);
192 result +=
static_cast<wchar_t>(i2);
204 result.reserve(in.size());
208 unsigned char c=in[i++];
218 else if(c<=0xDF && i<in.size())
223 code = (c & 0x1Fu) << 6;
227 else if(c<=0xEF && i+1<in.size())
229 code = (c & 0xFu) << 12;
231 code += (c & 0x3Fu) << 6;
235 else if(c<=0xF7 && i+2<in.size())
237 code = (c & 0x7u) << 18;
239 code += (c & 0x3Fu) << 12;
241 code += (c & 0x3Fu) << 6;
270 std::ostringstream &result,
271 const std::locale &
loc)
288 else if(ch <= 255 && isprint(ch,
loc))
290 const auto uch =
static_cast<unsigned char>(ch);
293 if(uch ==
'"' || uch ==
'\\')
301 result <<
"\\u" << std::hex << std::setw(4) << std::setfill(
'0')
302 <<
static_cast<unsigned int>(ch);
314 std::ostringstream &result,
315 const std::locale &
loc)
317 if(ch == (
wchar_t)
'\'')
319 const auto uch =
static_cast<unsigned char>(ch);
321 result <<
'\\' << uch;
333 std::ostringstream result;
334 const std::locale
loc;
348 std::ostringstream result;
349 const std::locale
loc;
350 for(
const auto ch : in)
365 std::wstring wide_string(utf16_str.begin(), utf16_str.end());
366 return std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,
wchar_t>{}
367 .to_bytes(wide_string);
369 return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}
370 .to_bytes(utf16_str);
377 return std::strtol(hex.c_str(),
nullptr, 16);