QProcess входная строка с акцентами

#c #qt #qprocess

#c #qt #qprocess

Вопрос:

У меня есть две программы, каждая с QProcess, и у меня разное поведение в отношении ввода QProcess с акцентированными символами (точнее, я создаю Qprocess для выполнения copy команды dos, и путь принимает акцент).

Средой выполнения и разработки является Windows 10.

Первая программа — это простой прототип, который я создал, чтобы проверить, может ли мой код работать правильно.

Вот прототип кода, который у меня есть, в котором копия работает корректно, интегрированная в простую main() функцию. Предполагается, что код копирует файл с именем sfx.exe в путь с ударением F:path_accentué , и он действительно выполняет копирование правильно.

 #include <QCoreApplication>
#include <Qdebug>
#include <QObject>
#include <QProcess>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QProcess* processus = new QProcess();
    QStringList args; 
    QString path("F:\path_accentué");
    
    args << "/C" << "copy" << "E:\test\sfx.exe" << path;
    processus->start("cmd.exe", args);  

    if (!processus->waitForStarted())
    {
        qDebug() << "Could not launch the process";
    }
    //processus->write(s.c_str());
    if (!processus->waitForFinished(-1))
    {
        qDebug() << "Finished";
    }
    delete processus;
    return app.exec();
}
 

Однако, когда я интегрирую (буквально копирую и вставляю без изменения) этот прототип в более крупный проект кода, мой экземпляр QProcess не распознает accentuated путь, как будто акценты больше не поддерживаются.

Это та часть, которую я копирую / вставляю в более крупный проект и которую я теперь выполняю с помощью нажатия кнопки в QT. И на этот раз QProcess не распознает выделенный путь (вместо этого он создает файл с таким именем path_accentu� ).

             QProcess* processus = new QProcess();
            QStringList args; 
            QString path("F:\path_accentué");
            args << "/C" << "copy" << "E:\test\sfx.exe" << path;            processus->start("cmd.exe", args);  
            if (!processus->waitForStarted())
            {
                        qDebug() << "Could not launch the process";
            }
            //processus->write(s.c_str());
            if (!processus->waitForFinished(-1))
            {
                        qDebug() << "Finished";
            }
 

Я не нахожу в документации способа заставить QProcess распознавать акцентированные входные данные.
Я хотел бы понять, почему экземпляр QProcess ведет себя по-другому при интеграции в мой более крупный проект.
Что может повлиять на поведение QProcess и привести к тому, что он будет по-другому обрабатывать входные данные во втором случае?

Примечание: QProcess необходим для большего количества вещей, но не только для копирования (например, для получения обратной связи и процента операций). Копия предназначена только для того, чтобы изолировать проблему. На самом деле я делаю гораздо больше вещей.

Комментарии:

1. Скорее всего, более крупный проект имеет разные настройки компилятора относительно того, как интерпретировать кодировку входного файла… Как создаются эти два проекта? Одинаковые / разные версии Qt? Тот же / другой компилятор / IDE?

2. Спасибо за ваш интерес. Та же версия QT, Visual Studio 2013

3. Вы уверены, что проблема в акценте? Будет ли это работать с другими путями в вашем большом проекте?

4. Конечно, я тестировал с любым путем, не содержащим акцента.

Ответ №1:

Я попытался воссоздать ваше поведение с помощью Qt 5.15 и смог создать файл с акцентом с помощью

  • start("cmd",{args...})
  • start("cmd /c args...")
  • setNativeArguments("/c args...") start("cmd")

Последний рекомендуется для вызовов «cmd», см. Примечания здесь:
https://doc.qt.io/qt-5/qprocess.html#start

Единственное, что не сработало, потому что это взаимоблокировки

  • setArguments({args...}) start("cmd")

Демонстрация здесь:
https://gist.github.com/elsamuko/59f110cf3a678beae9db27860f6305c9

Комментарии:

1. Отличное предложение, друг. Я не проверял некоторые из ваших подходов. Я проведу тест.