I see two ways to resolve the issue.
First is to use CharToOemBuff when writing a string to the "con" and OemToCharBuff when reading an input from it.
The other is to always use stderr/stdin for Win32 as it was done for msys before. I think it's more straightforward.
I tested the attached patch (build the source with msvc) and it fixes the issue. If it looks acceptible, then probably DEVTTY should not be used on Windows at all.
I found two other references of DEVTTY at
psql/command.c
success = saveHistory(fname ? fname : DEVTTY, -1, false, false);
and
contrib/pg_upgrade/option.c
log_opts.debug_fd = fopen(DEVTTY, "w");
By the way, is there any reason to use stderr for the prompt output, not stdout?
Regards,
Alexander
16.03.2012 23:13, Alvaro Herrera пишет:
Excerpts from exclusion's message of sáb mar 03 15:44:37 -0300 2012:
I'm using postgresSQL in Windows with Russian locale and get unreadable
messages when the postgres utilities prompting me for input.
Please look at the screenshot:
http://oi44.tinypic.com/aotje8.jpg
(The psql writes the unreadable message prompting for the password.)
But at the same time the following message (WARINING) displayed right.
I believe it's related to setlocale and the difference between OEM and ANSI
encoding, which we had in Windows with the Russian locale.
The startup code of psql sets locale with the call setlocale(LC_ALL, "") and
MSDN documentation says that the call:
Sets the locale to the default, which is the user-default ANSI code page
obtained from the operating system.
After the call all the strings printed with the printf(stdout) will go
through the ANSI->OEM conversion.
But in the simple_prompt function strings written to con, and such writes go
without conversion.
Were you able to come up with some way to make this work?