From 5bfaa86ceb3c2a9ac474a928e748c4a86a703b33 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Fri, 2 Nov 2018 01:04:39 +0900 Subject: curl: fixed UTF-8 in current console code page (Windows) Fixes #3211 Fixes #3175 Closes #3212 --- src/tool_cb_wrt.c | 31 ++++++++++++++++++++++++++++++- src/tool_main.c | 7 +------ 2 files changed, 31 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c index 476fef9a4..0e74392ac 100644 --- a/src/tool_cb_wrt.c +++ b/src/tool_cb_wrt.c @@ -156,7 +156,36 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata) } } - 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 */ diff --git a/src/tool_main.c b/src/tool_main.c index 612bfcb6a..6dc74d923 100644 --- a/src/tool_main.c +++ b/src/tool_main.c @@ -241,13 +241,12 @@ static void main_free(struct GlobalConfig *config) 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) */ @@ -257,10 +256,7 @@ static void configure_terminal(void) #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); @@ -282,7 +278,6 @@ static void restore_terminal(void) /* Restore Console output mode and codepage to whatever they were * when Curl started */ SetConsoleMode(TerminalSettings.hStdOut, TerminalSettings.dwOutputMode); - SetConsoleOutputCP(TerminalSettings.nCodepage); #endif } -- cgit v1.2.3