summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYasuhiro Matsumoto <mattn.jp@gmail.com>2018-11-02 01:04:39 +0900
committerDaniel Stenberg <daniel@haxx.se>2018-11-05 09:58:29 +0100
commit5bfaa86ceb3c2a9ac474a928e748c4a86a703b33 (patch)
tree7cc3a467361129b102064657bea7403c736b91f2 /src
parent29c05ce9c36dda4ee595b2606015cfb5222b0e39 (diff)
downloadcurl-5bfaa86ceb3c2a9ac474a928e748c4a86a703b33.tar.gz
curl: fixed UTF-8 in current console code page (Windows)
Fixes #3211 Fixes #3175 Closes #3212
Diffstat (limited to 'src')
-rw-r--r--src/tool_cb_wrt.c31
-rw-r--r--src/tool_main.c7
2 files changed, 31 insertions, 7 deletions
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
}