带重音符号的 QProcess 输入字符串

问题描述

我有两个程序,每个程序都带有 QProcess 并且我对带有重音字符的 QProcess 输入有不同的行为 (更准确地说,我创建了一个 Qprocess 来执行 dos copy 命令并且路径采用重音)。

执行和开发环境为 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 需要用于更多的事情,但不仅限于副本(例如获取反馈和操作百分比)。副本只是为了隔离问题。实际上,我做了更多的事情。

解决方法

我尝试使用 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