Bill Allombert on Wed, 19 Apr 2017 13:43:00 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: PARI/GP for Windows doesn't support umlauts and diacritical signs but it's possible |
On Wed, Apr 19, 2017 at 07:42:41AM +0200, Jens Schmidt wrote: > PARI/GP for Windows only supports ASCII chars in input and output. The > programm should set the both codepages for input and output to the > default value given by Windows registry (called ACP: ANSI codepage). > That is easily done by some C code at startup: > > SetConsoleCP( GetACP() ); > SetConsoleOutputCP( GetACP() ); > > By default the codepage of a Windows console is set to ancient DOS 437 > or 850,... called OEMCP. These old OEM codepages aren't recommend. > > ACP is CP 1252 by default (aka Western) which is nearly identical to > ISO-8859-1 and UTF-8 (Latin1 block). Windows uses some of the characters > 0x80 .. 0x9f which are non-printable chars in ISO-8859-1 and UTF-8. > > Windows has very limited support for UTF-8 console (codepage 65001). > UTF-8 file/console redirect isn't possible because Windows doesn't > support multibyte file IO - only single byte and wide chars. > > I've tested this with Windows 7 and Wine in Linux. Setting codepages > functions too through a PARI/GP plugin which could be installed at any > time and would make older versions working. Hello Jens, Thanks for your suggestion. I tried to write a patch following your suggestion but it did not seem to change anything on wine. See below. Cheers, Bill.
diff --git a/src/gp/gp.c b/src/gp/gp.c index dd542ec..9227fdd 100644 --- a/src/gp/gp.c +++ b/src/gp/gp.c @@ -16,6 +16,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** PARI CALCULATOR **/ /** **/ /*******************************************************************/ +#ifdef _WIN32 +# include "../systems/mingw/pwinver.h" +# include <windows.h> +# include "../systems/mingw/mingw.h" +#endif #include "pari.h" #include "paripriv.h" #include "gp.h" @@ -571,7 +576,9 @@ main(int argc, char **argv) cb_pari_ask_confirm = gp_ask_confirm; pari_init_paths(); pari_mt_init(); /* MPI: will not return on slaves (pari_MPI_rank = 0) */ - +#ifdef _WIN32 + if (stdin_isatty) win32_set_codepage(); +#endif #ifdef READLINE init_readline(); #endif diff --git a/src/systems/mingw/mingw.c b/src/systems/mingw/mingw.c index 5469276..3727571 100644 --- a/src/systems/mingw/mingw.c +++ b/src/systems/mingw/mingw.c @@ -136,6 +136,13 @@ win32_terminal_height(void) } void +win32_set_codepage(void) +{ + SetConsoleCP( GetACP() ); + SetConsoleOutputCP( GetACP() ); +} + +void win32_set_pdf_viewer(void) { char *s = getenv("GP_PDF_VIEWER"); diff --git a/src/systems/mingw/mingw.h b/src/systems/mingw/mingw.h index 3f42d7f..da7201f 100644 --- a/src/systems/mingw/mingw.h +++ b/src/systems/mingw/mingw.h @@ -16,6 +16,7 @@ char* win32_datadir(void); void win32_ansi_fputs(const char* s, void* f); int win32_terminal_width(void); int win32_terminal_height(void); +void win32_set_codepage(void); void win32_set_pdf_viewer(void); void win32_alarm(unsigned int s); long win32_timer(void);