]> granicus.if.org Git - python/commitdiff
Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk Sun)
authorSteve Dower <steve.dower@microsoft.com>
Sat, 8 Oct 2016 19:18:16 +0000 (12:18 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Sat, 8 Oct 2016 19:18:16 +0000 (12:18 -0700)
Misc/NEWS
Parser/myreadline.c

index e96581b8b18e35831f6f47704b908db0897e2f4c..dea4fd0e0116b98b3c40ac9401137eae1ad10617 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -213,6 +213,8 @@ Library
 Windows
 -------
 
+- Issue #28333: Enables Unicode for ps1/ps2 and input() prompts
+
 - Issue #28251: Improvements to help manuals on Windows.
 
 - Issue #28110: launcher.msi has different product codes between 32-bit and
index a8f23b790a1b117dde40e6eec04eeb496eacf7a5..4f7a9fcc92c0119eb8f03b358882e01ff3ed90fb 100644 (file)
@@ -203,17 +203,37 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt)
 
 #ifdef MS_WINDOWS
     if (!Py_LegacyWindowsStdioFlag && sys_stdin == stdin) {
-        HANDLE hStdIn;
+        HANDLE hStdIn, hStdErr;
 
         _Py_BEGIN_SUPPRESS_IPH
         hStdIn = (HANDLE)_get_osfhandle(fileno(sys_stdin));
+        hStdErr = (HANDLE)_get_osfhandle(fileno(stderr));
         _Py_END_SUPPRESS_IPH
 
         if (_get_console_type(hStdIn) == 'r') {
             fflush(sys_stdout);
-            if (prompt)
-                fprintf(stderr, "%s", prompt);
-            fflush(stderr);
+            if (prompt) {
+                if (_get_console_type(hStdErr) == 'w') {
+                    wchar_t *wbuf;
+                    int wlen;
+                    wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1,
+                            NULL, 0);
+                    if (wlen++ &&
+                        (wbuf = PyMem_RawMalloc(wlen * sizeof(wchar_t)))) {
+                        wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1,
+                                wbuf, wlen);
+                        if (wlen) {
+                            DWORD n;
+                            fflush(stderr);
+                            WriteConsoleW(hStdErr, wbuf, wlen, &n, NULL);
+                        }
+                        PyMem_RawFree(wbuf);
+                    }
+                } else {
+                    fprintf(stderr, "%s", prompt);
+                    fflush(stderr);
+                }
+            }
             clearerr(sys_stdin);
             return _PyOS_WindowsConsoleReadline(hStdIn);
         }