]> granicus.if.org Git - jq/commitdiff
Don't call SetConsoleOutputCP
authorYasuhiro Matsumoto <mattn.jp@gmail.com>
Fri, 1 Apr 2016 05:53:38 +0000 (14:53 +0900)
committerNicolas Williams <nico@cryptonector.com>
Sun, 26 Feb 2017 00:51:04 +0000 (18:51 -0600)
Should use wide-string function instead of SetConsoleOutputCP.

Fixes #1121

src/jv_print.c
src/main.c

index ce4a59afa025a539a627899c81bc9c4ff5299ee0..cb2824d21fa6a769a020744008a1c9675ae6d4c7 100644 (file)
@@ -37,9 +37,20 @@ static void put_buf(const char *s, int len, FILE *fout, jv *strout, int is_tty)
   } else {
 #ifdef WIN32
   /* See util.h */
-  if (is_tty)
-    WriteFile((HANDLE)_get_osfhandle(fileno(fout)), s, len, NULL, NULL);
-  else
+  if (is_tty) {
+    wchar_t *ws;
+    size_t wl;
+    if (len == -1)
+      len = strlen(s);
+    wl = MultiByteToWideChar(CP_UTF8, 0, s, len, NULL, 0);
+    ws = malloc((wl + 1) * sizeof(*ws));
+    if (!ws)
+      return;
+    wl = MultiByteToWideChar(CP_UTF8, 0, s, len, ws, wl + 1);
+    ws[wl] = 0;
+    WriteConsoleW((HANDLE)_get_osfhandle(fileno(fout)), ws, wl, NULL, NULL);
+    free(ws);
+  } else
     fwrite(s, 1, len, fout);
 #else
   fwrite(s, 1, len, fout);
index 427a294c6341f888ccf7692ef67ccfb9cd75769d..d87179878c3db5fdf3a17a865dfa8e8830c0e463 100644 (file)
@@ -203,7 +203,6 @@ int main(int argc, char* argv[]) {
   jv program_arguments = jv_array();
 
 #ifdef WIN32
-  SetConsoleOutputCP(CP_UTF8);
   fflush(stdout);
   fflush(stderr);
   _setmode(fileno(stdout), _O_TEXT | _O_U8TEXT);