aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 e96581b8b1..dea4fd0e01 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 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);
}