From 4ff609adb00ab3264b91cc9c2f7c44a360348795 Mon Sep 17 00:00:00 2001 From: Lasse Collin Date: Wed, 18 Dec 2024 14:23:13 +0200 Subject: [PATCH] xzdec: Use setlocale() via tuklib_gettext_setlocale() 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 (cherry picked from commit 78868b6ed63fa4c89f73e3dfed27abfb8b0d46db) --- src/xzdec/xzdec.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/xzdec/xzdec.c b/src/xzdec/xzdec.c index 49d47bb2..84d31929 100644 --- a/src/xzdec/xzdec.c +++ b/src/xzdec/xzdec.c @@ -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);