]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
xzdec: Use setlocale() via tuklib_gettext_setlocale()
authorLasse Collin <lasse.collin@tukaani.org>
Wed, 18 Dec 2024 12:23:13 +0000 (14:23 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Wed, 18 Dec 2024 15:09:30 +0000 (17:09 +0200)
xzdec isn't translated and didn't have locale-specific behavior
in the past. On Windows with UTF-8 in the application manifest,
setting the locale makes a difference though:

  - Without any setlocale() call, non-ASCII filenames don't display
    properly in Command Prompt unless one first uses "chcp 65001"
    to set the console code page to UTF-8.

  - setlocale(LC_ALL, "") is enough to make non-ASCII filenames
    print correctly in Command Prompt without using "chcp 65001",
    assuming that the non-UTF-8 code page (like 850) supports
    those non-ASCII characters.

  - setlocale(LC_ALL, ".UTF8") is even better because then mbrtowc() and
    such functions use an UTF-8 locale instead of a legacy code page.
    The tuklib_gettext_setlocale() macro takes care of this (without
    enabling any translations).

Fixes: 46ee0061629fb075d61d83839e14dd193337af59
src/xzdec/xzdec.c

index 49d47bb220980665b3b1974b7633de2913ed4a2f..84d319292f32428f745c22ef72cf27132a849500 100644 (file)
@@ -41,6 +41,7 @@
 #endif
 
 #include "getopt.h"
+#include "tuklib_gettext.h"
 #include "tuklib_progname.h"
 #include "tuklib_exit.h"
 
@@ -419,6 +420,17 @@ main(int argc, char **argv)
        (void)prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
 #endif
 
+       // We need to set the locale even though we don't have any
+       // translated messages:
+       //
+       //   - This is needed on Windows to make non-ASCII filenames display
+       //     properly when the active code page has been set to UTF-8
+       //     in the application manifest. Use the helper macro from
+       //     tuklib_gettext.h instead of plain setlocale(LC_ALL, "")
+       //     because on Windows the standard call isn't enough for
+       //     full UTF-8 support.
+       tuklib_gettext_setlocale();
+
        // Parse the command line options.
        parse_options(argc, argv);