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

Posted

技术标签:

【中文标题】带重音符号的 QProcess 输入字符串【英文标题】:QProcess input string with accents 【发布时间】:2021-02-08 13:08:36 【问题描述】:

我有两个程序,每个程序都带有 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 版本?相同/不同的编译器/IDE? @Thx 供您参考。相同的 QT 版本,Visual Studio 2013 您确定问题出在口音上吗?它是否适用于您更大项目中的其他路径? 当然,我用任何不包含重音的路径进行了测试。 【参考方案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

【讨论】:

伟大的建议朋友。我没有测试你的一些方法。我会做测试。

以上是关于带重音符号的 QProcess 输入字符串的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA

MacOS:如何禁用重音字符输入

将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)

MailMessage 带重音符号的附件文件名

PHP 过滤器用无重音符号替换重音字符

从字符串中删除重音符号