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) --- Parser/myreadline.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'Parser') diff --git a/Parser/myreadline.c b/Parser/myreadline.c index a8f23b790a..4f7a9fcc92 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 v1.2.1