summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2016-10-08 12:18:28 -0700
committerSteve Dower <steve.dower@microsoft.com>2016-10-08 12:18:28 -0700
commit55d2ba74e2ee9bb823af93c1d181ead89833e488 (patch)
treee4a9397f3c10c6dbc1957f67763d75c8379945a5
parent0ce1bf43bcb1190d6d6da1282b781861f72c92bf (diff)
parent3cd187b9f51f37e351d5ea4c8448b4769f8a3d9f (diff)
downloadcpython-git-55d2ba74e2ee9bb823af93c1d181ead89833e488.tar.gz
Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk Sun)
-rw-r--r--Misc/NEWS2
-rw-r--r--Parser/myreadline.c28
2 files changed, 26 insertions, 4 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index dfbbf78d06..176de1c805 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -222,6 +222,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 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);
}