summaryrefslogtreecommitdiff
path: root/src/tool_cb_wrt.c
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/tool_cb_wrt.c
parent29c05ce9c36dda4ee595b2606015cfb5222b0e39 (diff)
downloadgnurl-5bfaa86ceb3c2a9ac474a928e748c4a86a703b33.tar.gz
gnurl-5bfaa86ceb3c2a9ac474a928e748c4a86a703b33.tar.bz2
gnurl-5bfaa86ceb3c2a9ac474a928e748c4a86a703b33.zip
curl: fixed UTF-8 in current console code page (Windows)
Fixes #3211 Fixes #3175 Closes #3212
Diffstat (limited to 'src/tool_cb_wrt.c')
-rw-r--r--src/tool_cb_wrt.c31
1 files changed, 30 insertions, 1 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 */