18 #include <util/pragma_push.def>
20 #pragma warning(disable:4668)
24 #include <util/pragma_pop.def>
31 int slength=static_cast<int>(wcslen(s));
33 WideCharToMultiByte(CP_UTF8, 0, s, slength, NULL, 0, NULL, NULL);
34 std::string
r(rlength, 0);
35 WideCharToMultiByte(CP_UTF8, 0, s, slength, &
r[0], rlength, NULL, NULL);
44 r+=static_cast<char>(*s);
52 std::wstring
widen(
const char *s)
56 int slength=static_cast<int>(strlen(s));
58 MultiByteToWideChar(CP_UTF8, 0, s, slength, NULL, 0);
59 std::wstring
r(rlength, 0);
60 MultiByteToWideChar(CP_UTF8, 0, s, slength, &
r[0], rlength);
77 std::string
narrow(
const std::wstring &s)
81 int slength=static_cast<int>(s.size());
83 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, NULL, 0, NULL, NULL);
84 std::string
r(rlength, 0);
85 WideCharToMultiByte(CP_UTF8, 0, &s[0], slength, &
r[0], rlength, NULL, NULL);
90 return std::string(s.begin(), s.end());
94 std::wstring
widen(
const std::string &s)
98 int slength=static_cast<int>(s.size());
100 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, NULL, 0);
101 std::wstring
r(rlength, 0);
102 MultiByteToWideChar(CP_UTF8, 0, &s[0], slength, &
r[0], rlength);
107 return std::wstring(s.begin(), s.end());
116 result+=static_cast<char>(c);
119 result+=static_cast<char>((c >> 6) | 0xc0);
120 result+=static_cast<char>((c &0x3f) | 0x80);
124 result+=static_cast<char>((c >> 12) | 0xe0);
125 result+=static_cast<char>(((c >> 6) &0x3f) | 0x80);
126 result+=static_cast<char>((c &0x3f) | 0x80);
130 result+=static_cast<char>((c >> 18) | 0xf0);
131 result+=static_cast<char>(((c >> 12) &0x3f)| 0x80);
132 result+=static_cast<char>(((c >> 6) &0x3f) | 0x80);
133 result+=static_cast<char>((c &0x3f) | 0x80);
144 result.reserve(s.size());
146 for(
const auto c : s)
152 std::vector<std::string>
narrow_argv(
int argc,
const wchar_t **argv_wide)
154 if(argv_wide==
nullptr)
155 return std::vector<std::string>();
157 std::vector<std::string> argv_narrow;
158 argv_narrow.reserve(argc);
160 for(
int i=0; i!=argc; ++i)
161 argv_narrow.push_back(
narrow(argv_wide[i]));
174 result += static_cast<wchar_t>(code);
184 const uint16_t i1 = static_cast<uint16_t>(((code >> 10) & 0x3ff) | 0xD800);
185 result += static_cast<wchar_t>(i1);
186 const uint16_t i2 = static_cast<uint16_t>((code & 0x3ff) | 0xDC00);
187 result += static_cast<wchar_t>(i2);
199 result.reserve(in.size());
203 unsigned char c=in[i++];
213 else if(c<=0xDF && i<in.size())
218 code = (c & 0x1Fu) << 6;
222 else if(c<=0xEF && i+1<in.size())
224 code = (c & 0xFu) << 12;
226 code += (c & 0x3Fu) << 6;
230 else if(c<=0xF7 && i+2<in.size())
232 code = (c & 0x7u) << 18;
234 code += (c & 0x3Fu) << 12;
236 code += (c & 0x3Fu) << 6;
261 std::ostringstream &result,
262 const std::locale &
loc)
279 else if(ch <= 255 && isprint(ch,
loc))
281 const auto uch = static_cast<unsigned char>(ch);
283 if(uch ==
'"' || uch ==
'\\' || uch ==
'\'')
291 result <<
"\\u" << std::hex << std::setw(4) << std::setfill(
'0')
292 << static_cast<unsigned int>(ch);
300 std::ostringstream result;
301 const std::locale
loc;
310 std::ostringstream result;
311 const std::locale
loc;
312 for(
const auto ch : in)