}
}
- rc = fwrite(buffer, sz, nmemb, outs->stream);
+#ifdef _WIN32
+ if(isatty(fileno(outs->stream))) {
+ DWORD in_len = (DWORD)(sz * nmemb);
+ wchar_t* wc_buf;
+ DWORD wc_len;
+
+ /* calculate buffer size for wide characters */
+ wc_len = MultiByteToWideChar(CP_UTF8, 0, buffer, in_len, NULL, 0);
+ wc_buf = (wchar_t*) malloc(wc_len * sizeof(wchar_t));
+ if(!wc_buf)
+ return failure;
+
+ /* calculate buffer size for multi-byte characters */
+ wc_len = MultiByteToWideChar(CP_UTF8, 0, buffer, in_len, wc_buf, wc_len);
+
+ if(!WriteConsoleW(
+ (HANDLE) _get_osfhandle(fileno(outs->stream)),
+ wc_buf,
+ wc_len,
+ &wc_len,
+ NULL)) {
+ free(wc_buf);
+ return failure;
+ }
+ free(wc_buf);
+ rc = bytes;
+ }
+ else
+#endif
+ rc = fwrite(buffer, sz, nmemb, outs->stream);
if(bytes == rc)
/* we added this amount of data to the output */
static struct TerminalSettings {
HANDLE hStdOut;
DWORD dwOutputMode;
- UINT nCodepage;
} TerminalSettings;
static void configure_terminal(void)
{
/*
- * If we're running Windows, enable VT output & set codepage to UTF-8.
+ * If we're running Windows, enable VT output.
* Note: VT mode flag can be set on any version of Windows, but VT
* processing only performed on Win10 >= Creators Update)
*/
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif
- /* Cache current codepage (will restore on exit) & set codepage to UTF-8 */
memset(&TerminalSettings, 0, sizeof(TerminalSettings));
- TerminalSettings.nCodepage = GetConsoleOutputCP();
- SetConsoleOutputCP(65001);
/* Enable VT output */
TerminalSettings.hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
/* Restore Console output mode and codepage to whatever they were
* when Curl started */
SetConsoleMode(TerminalSettings.hStdOut, TerminalSettings.dwOutputMode);
- SetConsoleOutputCP(TerminalSettings.nCodepage);
#endif
}