From 3bdcee46068093dea8aeff84697e9207eed0ced7 Mon Sep 17 00:00:00 2001 From: Takuji Tanaka Date: Fri, 11 Dec 2020 13:01:21 +0000 Subject: dvi2tty: Allow output of Unicode strings on console (Windows only) git-svn-id: svn://tug.org/texlive/trunk@57112 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/dvi2tty/ChangeLog | 5 ++++ Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c | 30 ++++++++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) (limited to 'Build/source') diff --git a/Build/source/texk/dvi2tty/ChangeLog b/Build/source/texk/dvi2tty/ChangeLog index 7d9e800d312..f8659346983 100644 --- a/Build/source/texk/dvi2tty/ChangeLog +++ b/Build/source/texk/dvi2tty/ChangeLog @@ -1,3 +1,8 @@ +2020-12-11 TANAKA Takuji + + * dvistuff.c: Allow output of Unicode strings on Windows console. + It works with "-Eu -q" option. (Windows only) + 2017-03-27 Karl Berry * Makefile.am (AM_TESTS_ENVIRONMENT): use instead of TESTS_ENVIRONMENT. diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c b/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c index ec05239ef18..652da28531c 100644 --- a/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c +++ b/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c @@ -679,11 +679,31 @@ void printpage(void) if (ch >= SPACE || allchar) { if (utf8 && (ch & IS_UNICODE)) { - mbch = UCStoUTF8(ch & MAX_UNICODE); - if (BYTE1(mbch) != 0) putc((unsigned char)BYTE1(mbch), output); - if (BYTE2(mbch) != 0) putc((unsigned char)BYTE2(mbch), output); - if (BYTE3(mbch) != 0) putc((unsigned char)BYTE3(mbch), output); - /* always */ putc((unsigned char)BYTE4(mbch), output); +#ifdef WIN32 + wchar_t wch; + HANDLE hStdout; + DWORD ret; + const int fd = fileno(output); + + if ((fd == fileno(stdout) || fd == fileno(stderr)) && _isatty(fd)) { + if (fd == fileno(stdout)) + hStdout = GetStdHandle(STD_OUTPUT_HANDLE); + else + hStdout = GetStdHandle(STD_ERROR_HANDLE); + + wch=(wchar_t)(ch & MAX_UNICODE); /* do not expect over BMP */ + WriteConsoleW(hStdout, &wch, 1, &ret, NULL); + + } else { +#endif + mbch = UCStoUTF8(ch & MAX_UNICODE); + if (BYTE1(mbch) != 0) putc((unsigned char)BYTE1(mbch), output); + if (BYTE2(mbch) != 0) putc((unsigned char)BYTE2(mbch), output); + if (BYTE3(mbch) != 0) putc((unsigned char)BYTE3(mbch), output); + /* always */ putc((unsigned char)BYTE4(mbch), output); +#ifdef WIN32 + } +#endif } else if (japan) { for (k = 0; k < kanji1; k++) { -- cgit v1.2.3