]> granicus.if.org Git - curl/commitdiff
curl: fixed UTF-8 in current console code page (Windows)
authorYasuhiro Matsumoto <mattn.jp@gmail.com>
Thu, 1 Nov 2018 16:04:39 +0000 (01:04 +0900)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 5 Nov 2018 08:58:29 +0000 (09:58 +0100)
Fixes #3211
Fixes #3175
Closes #3212

src/tool_cb_wrt.c
src/tool_main.c

index 476fef9a46498fa5651ef5d53e0fa7e0f5b54525..0e74392acc85671647dee48b092ff2fd58cbb3a7 100644 (file)
@@ -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 */
index 612bfcb6aabacbe85fbaa2f16b67c3e2030075d2..6dc74d9234bd70ff195db184b2f12d54a662812f 100644 (file)
@@ -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
 }