diff --git a/src/cygwin-cygutils/src/clip/getclip.c b/src/cygwin-cygutils/src/clip/getclip.c
index 82e7070..772dfe5 100644
--- a/src/cygwin-cygutils/src/clip/getclip.c
+++ b/src/cygwin-cygutils/src/clip/getclip.c
@@ -32,6 +32,7 @@
 #include <wchar.h>
 #include <sys/cygwin.h>
 #include <w32api/stringapiset.h>
+#include <locale.h>
 
 #define DEBUGGING 0 // Set 1 to display debug output on stderr
 
@@ -198,6 +199,8 @@ main (int argc, const char **argv)
       goto exit;
     }
   rest = poptGetArgs (optCon);
+
+  setlocale (LC_ALL, "");
   if (rest == NULL)
     ec |= getclip (stdout, flags, stderr, program_name);
   else
@@ -425,16 +428,14 @@ getclip (FILE * out, flags_struct flags, FILE * f, char *name)
               int srclen = wcslen (lpwstr); // wide-char count
               int dstlen = srclen << 2; // byte count
               LPSTR dst = (LPSTR) malloc (dstlen);
-              int res = WideCharToMultiByte (CP_UTF8, 0, lpwstr, srclen,
-                                             dst, dstlen, NULL, NULL);
+              int res = wcstombs (dst, lpwstr, dstlen);
               if (res > 0)
                 fwrite (dst, sizeof (char), res, out);
-              else if (res == 0)
+              else if (res == -1)
                 {
 #if DEBUGGING
-                  DWORD err = GetLastError ();
-                  /* look up error code displayed here in w32api/winerror.h */
-                  fprintf (stderr, "WideCharToMultiByte returns %ld\n", err);
+                  /* look up error code displayed here in sys/errno.h */
+                  fprintf (stderr, "wcstombs error (errno=%d)\n", errno);
 #endif
                 }
               free (dst);
diff --git a/src/cygwin-cygutils/src/clip/putclip.c b/src/cygwin-cygutils/src/clip/putclip.c
index abdb8cf..ae58b62 100644
--- a/src/cygwin-cygutils/src/clip/putclip.c
+++ b/src/cygwin-cygutils/src/clip/putclip.c
@@ -32,6 +32,7 @@
 #include <wchar.h>
 #include <sys/cygwin.h>
 #include <w32api/stringapiset.h>
+#include <locale.h>
 
 #define DEBUGGING 0 // Set 1 to display debug output on stderr
 
@@ -198,6 +199,7 @@ main (int argc, const char **argv)
 
   rest = poptGetArgs (optCon);
 
+  setlocale (LC_ALL, "");
   if (rest == NULL)
     ec |= putclip (stdin, flags, stderr, program_name);
   else
@@ -608,17 +610,16 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
           return (PUTCLIP_ERR);
         }
 
-      int res = MultiByteToWideChar (CP_UTF8, 0, convbuf, convlen,
-                                     (LPWSTR) clipbuf, convlen + 1);
-      if (res == 0)
+      convbuf[convlen] = '\0';
+      int res = mbstowcs (clipbuf, convbuf, convlen + 1);
+      if (res == -1)
         {
 #if DEBUGGING
-          DWORD err = GetLastError ();
-          /* look up error code displayed here in w32api/winerror.h */
-          fprintf (stderr, "MultiByteToWideChar returns %ld\n", err);
+          /* look up error code displayed here in sys/errno.h */
+          fprintf (stderr, "mbstowcs error (errno=%d)\n", errno);
 #endif
         }
-      else /* res != 0 */
+      else /* res != -1 */
         {
           *((WCHAR *) clipbuf + res) = 0; /* NULL-terminate just in case */
 #if DEBUGGING
