From d3a53a702ecbc36ebfb7192a91be4a7e608a5d69 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 25 Apr 2019 09:28:48 +0200 Subject: [PATCH] Set console code page to CP_UTF8 on Windows if supported. (#3050) Previously, we enforced code page 850 for all console input and output, which breaks with non-western scripts. Since more recent Windows shells are able to display Unicode properly, this patch now enforces UTF-8 and falls back to code page 850 only if UTF-8 is unsupported. Non-Windows systems default to UTF-8, but can override the codec by setting the LANG environment variable to something other than C. Resolves #3049. --- src/cli/TextStream.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/cli/TextStream.cpp b/src/cli/TextStream.cpp index d75cb74a..938fd629 100644 --- a/src/cli/TextStream.cpp +++ b/src/cli/TextStream.cpp @@ -19,6 +19,9 @@ #include #include +#ifdef Q_OS_WIN +#include +#endif TextStream::TextStream() { @@ -59,12 +62,26 @@ void TextStream::detectCodec() { QString codecName = "UTF-8"; auto env = QProcessEnvironment::systemEnvironment(); + #ifdef Q_OS_WIN - if (!env.contains("SHELL")) { - // native shell (no Msys or cygwin) + WINBOOL success = false; +#ifdef CP_UTF8 + success = SetConsoleOutputCP(CP_UTF8); +#endif + if (!success && !env.contains("SHELL")) { + // Fall back to cp850 if this is Windows without CP_UTF8 and we + // are running in a native shell (i.e., no Msys or Cygwin). codecName = "Windows-850"; } +#else + if (env.contains("LANG") && !env.value("LANG").isEmpty() && env.value("LANG") != "C") { + // Only override codec if LANG is set, otherwise Qt will assume + // US-ASCII, which is almost always wrong and results in + // Unicode passwords being displayed as question marks. + codecName = QTextCodec::codecForLocale()->name(); + } #endif + codecName = env.value("ENCODING_OVERRIDE", codecName); auto* codec = QTextCodec::codecForName(codecName.toLatin1()); if (codec) {