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

QProcess input string with accents

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

执行开发环境Windows10.

第一个程序是我制作的一个简单原型,用于测试我的代码是否可以正常工作。

这是我的原型代码,其中副本工作正常,集成在一个简单的 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 路径,就好像重音符号不存在一样更多支持。

这是我在更大的项目中 copy/paste 的部分,我现在通过在 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