New implementation of pseudo console support (experimental)
Takashi Yano
takashi.yano@nifty.ne.jp
Tue Sep 1 09:23:03 GMT 2020
On Tue, 1 Sep 2020 06:46:53 +0200 (CEST)
Johannes Schindelin wrote:
> -- snip --
> diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
> index 43eebc174..65b4d45fa 100644
> --- a/winsup/cygwin/fhandler_tty.cc
> +++ b/winsup/cygwin/fhandler_tty.cc
> @@ -2867,7 +2867,16 @@ fhandler_pty_slave::setup_locale (void)
> char charset[ENCODING_LEN + 1] = "ASCII";
> LCID lcid = get_langinfo (locale, charset);
>
> - /* Set console code page form locale */
> + /* Special-case the UTF-8 character set */
> + if (strcasecmp (charset, "UTF-8") == 0)
> + {
> + get_ttyp ()->term_code_page = CP_UTF8;
> + SetConsoleCP (CP_UTF8);
> + SetConsoleOutputCP (CP_UTF8);
> + return;
> + }
> +
> + /* Set console code page from locale */
> if (get_pseudo_console ())
> {
> UINT code_page;
> -- snap --
I don't think you do right thing. Your first test case makes
garbled output in command prompt, therefore output in cygwin
should be the same.
I believe the correct maner as Windows programs are such as:
[Code A]
#include <windows.h>
#include <stdio.h>
int main(){
int origcp = GetConsoleOutputCP();
SetConsoleOutputCP(CP_UTF8);
puts("Привет мир! Hello world!");
SetConsoleOutputCP(origcp);
return 0;
}
[Code B]
#include <locale.h>
#include <stdio.h>
int main(){
setlocale (LC_ALL, "");
_putws(L"Привет мир! Hello world!");
return 0;
}
if the source code is in UTF-8 coding. Or compiled
with -fexec-charset=utf-8.
Both work as expected in command prompt as well as
in current cygwin.
--
Takashi Yano <takashi.yano@nifty.ne.jp>
More information about the Cygwin-developers
mailing list