From 3cd187b9f51f37e351d5ea4c8448b4769f8a3d9f Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sat, 8 Oct 2016 12:18:16 -0700 Subject: Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk Sun) --- Misc/NEWS | 2 ++ Parser/myreadline.c | 28 ++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index e96581b..dea4fd0 100644 --- 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 diff --git a/Parser/myreadline.c b/Parser/myreadline.c index a8f23b7..4f7a9fc 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -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); } -- cgit v0.12