diff options
author | Anne Jan Brouwer <brouwer@annejan.com> | 2018-12-10 11:56:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-10 11:56:30 +0100 |
commit | fa747ad36f00dea4f67de009b650060f4f837992 (patch) | |
tree | 39854f73ad0890497941fbb74bde0a0d2f43edd7 | |
parent | 8e77509053468d0b28b158a3aed1e88c86b3dd3a (diff) | |
parent | 11a04a2d92517abbd231534fa71bd346274f053f (diff) |
Merge pull request #435 from rdoeffinger/encodingfix
Fix character encoding issues for non-UTF-8 locales.
-rw-r--r-- | src/executor.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/executor.cpp b/src/executor.cpp index cd20f11c..c39b76a8 100644 --- a/src/executor.cpp +++ b/src/executor.cpp @@ -119,6 +119,26 @@ void Executor::execute(int id, const QString &workDir, const QString &app, } /** + * @brief decodes the input into a string assuming UTF-8 encoding. + * If this fails (which is likely if it is not actually UTF-8) + * it will then fall back to Qt's decoding function, which + * will try based on BOM and if that fails fall back to local encoding. + * + * @param in input data + * @return Input bytes decoded to string + */ +static QString decodeAssumingUtf8(QByteArray in) +{ + QTextCodec *codec = QTextCodec::codecForName("UTF-8"); + QTextCodec::ConverterState state; + QString out = codec->toUnicode(in.constData(), in.size(), &state); + if (!state.invalidChars) + return out; + codec = QTextCodec::codecForUtfText(in); + return codec->toUnicode(in); +} + +/** * @brief Executor::executeBlocking blocking version of the executor, * takes input and presents it as stdin * @param app @@ -147,9 +167,8 @@ int Executor::executeBlocking(QString app, const QStringList &args, } internal.waitForFinished(-1); if (internal.exitStatus() == QProcess::NormalExit) { - QTextCodec *codec = QTextCodec::codecForLocale(); - QString pout = codec->toUnicode(internal.readAllStandardOutput()); - QString perr = codec->toUnicode(internal.readAllStandardError()); + QString pout = decodeAssumingUtf8(internal.readAllStandardOutput()); + QString perr = decodeAssumingUtf8(internal.readAllStandardError()); if (process_out != Q_NULLPTR) *process_out = pout; if (process_err != Q_NULLPTR) @@ -205,11 +224,10 @@ void Executor::finished(int exitCode, QProcess::ExitStatus exitStatus) { running = false; if (exitStatus == QProcess::NormalExit) { QString output, err; - QTextCodec *codec = QTextCodec::codecForLocale(); if (i.readStdout) - output = codec->toUnicode(m_process.readAllStandardOutput()); + output = decodeAssumingUtf8(m_process.readAllStandardOutput()); if (i.readStderr || exitCode != 0) { - err = codec->toUnicode(m_process.readAllStandardError()); + err = decodeAssumingUtf8(m_process.readAllStandardError()); if (exitCode != 0) { #ifdef QT_DEBUG dbg() << exitCode << err; |