diff options
author | Yasuhiro Matsumoto <mattn.jp@gmail.com> | 2018-11-02 01:04:39 +0900 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-11-05 09:58:29 +0100 |
commit | 5bfaa86ceb3c2a9ac474a928e748c4a86a703b33 (patch) | |
tree | 7cc3a467361129b102064657bea7403c736b91f2 /src/tool_cb_wrt.c | |
parent | 29c05ce9c36dda4ee595b2606015cfb5222b0e39 (diff) | |
download | gnurl-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.c | 31 |
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 */ |