[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-wget] Patch: Fix printing mutibyte characters as unprintable ch
From: |
Eli Zaretskii |
Subject: |
Re: [Bug-wget] Patch: Fix printing mutibyte characters as unprintable characters on Windows |
Date: |
Sat, 04 Nov 2017 10:52:37 +0200 |
> From: "YX Hao" <address@hidden>
> Cc: "'Eli Zaretskii'" <address@hidden>
> Date: Fri, 3 Nov 2017 20:14:02 +0800
>
> Second, as my test, 'setlocale' is needed for the gnu printf related
> functions to work correctly on mutibyte characters. You can see that as
> attached screensots:
> setlocale_936.png
> setlocale_empty.png
> setlocale_omitted-OCP-0.png, the 3 results are the same
What do you mean by "gnu printf related functions"? If this is a
build that doesn't define ENABLE_NLS, then wget outputs the original
text using the MS runtime versions of printf. And in a build that
does define ENABLE_NLS, the text is additionally processed by the GNU
gettext library. So is the problem with the build which defines
ENABLE_NLS or the build that didn't define ENABLE_NLS? Or is it with
both?
> > Your change calls setlocale with a different value, does that even when
>
> One tricky situation: one PC is all set to United States, except the
> multibyte code page is 936, for example.
> So, '_getmbcp' is used.
Maybe the problem is that the codepage used for the console output is
different from the system's ANSI codepage? What does
GetConsoleOutputCP return in the case you describe?
> static void
> i18n_initialize (void)
> {
> +#if defined(WINDOWS) && !defined(ENABLE_NLS)
> + char MBCP[8] = "";
> + int CP;
> +#endif
> +
> /* ENABLE_NLS implies existence of functions invoked here. */
> #ifdef ENABLE_NLS
> /* Set the current locale. */
> setlocale (LC_ALL, "");
> /* Set the text message domain. */
> bindtextdomain ("wget", LOCALEDIR);
> textdomain ("wget");
> #endif /* ENABLE_NLS */
> +
> +#if defined(WINDOWS) && !defined(ENABLE_NLS)
> + CP = _getmbcp(); /* Consider it's different from default. */
> + if (CP > 0)
> + sprintf(MBCP, ".%d", CP);
> + setlocale(LC_ALL, MBCP);
> +#endif }
What happens if ENABLE_NLS is defined? Your patch only handles the
situation where ENABLE_NLS is NOT defined.