文件名包括路径名称中的中文无法识别,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件名包括路径名称中的中文无法识别,相关的知识,希望对你有一定的参考价值。

本来是好的,突然有次无法正常启动后,这些文件就无法打开,很多软件都是如此,感觉应该是系统的问题,但是网上搜索了半天也没有找到解决方案,跪求高手救急啊!
本人已经找到了问题的原因,是非Unicode语言的问题,系统中的Unicode编码出现了未知原因的损坏,我将非Unicode语言更改为“中文简体(新加坡)”就恢复了,不再出现乱码(记事本中的乱码恢复正常,路径中的简体中文可以识别),但是新的问题出现了,新加坡那边不用宋体字体,所以系统中如果有软件是默认宋体的话,还是看不到的,所以说遇到这种情况想要根治的话,只有重装系统了,除非你是电脑高手可以从系统中修复这个非Unicode区域语言的编码。

你把路径上的所有中文文件夹改成英文的
PS:亲是不是最近对这款软件进行过升级追问

首先不是某个软件的问题,包括记事本的中文也显示乱码,其次并没有升级的问题。

参考技术A 设定电脑系统区域语言试试追问

电脑系统区域语言就是中文简体,应该不是这个问题。不过依然感谢回答!

追答

估计要把文件目录英文命名了

追问

如果是这样的话工作量会非常之大啊!

Qt软件开发_解决中文路径无法识别问题

1. 前言

在QT for Windows 下编程时,经常因为一些中文路径、带空格的路径导致一些问题出现。

目录无法打开、文件无法打开、程序无法调用等等。下面记录一些出现问题的场景,并提供一些解决办法。

2. _chdir切换带空格的目录

chdir 是C语言中的一个系统调用函数(同cd),用于改变当前工作目录,其参数为Path 目标目录,可以是绝对目录或相对目录。

在Qt里调用_chdir函数切换当前工作目录时,如果目录有空格或者中文会导致路径切换失败。

(1)切换失败的情况

//切换路径
void MainWindow::on_pushButton_clicked()

    QString strAppPath ="D:\\\\360安全浏览器下载";

    qDebug() << "strAppPath:" << strAppPath;

    QByteArray utf8_array = strAppPath.toUtf8();
    qDebug()<<"路径切换状态:"<<_chdir(utf8_array.data()); //切换工作目录
    //切换失败:
    //路径切换状态: -1

(2)优化后-解决问题

QString strAppPath ="D:/360安全浏览器下载"; 

qDebug() << "strAppPath:" << strAppPath;

QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
std::string name = code->fromUnicode(strAppPath).data();

QByteArray utf8_array = name.c_str();
qDebug()<<"路径切换状态:"<<_chdir(name.c_str()); //切换工作目录

3. QProcess执行-目录带中文

QProcess类用于启动外部程序并与它们通信。
运行进程要启动进程,请将要运行的程序的名称和命令行参数作为参数传递给start()。参数在QStringList中作为单个字符串提供。
或者,可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。
      QObject *parent;
      ...
      QString program = "./path/to/Qt/examples/widgets/analogclock";
      QStringList arguments;
      arguments << "-style" << "fusion";

      QProcess *myProcess = new QProcess(parent);
      myProcess->start(program, arguments);
然后,QProcess进入启动状态,程序启动后,QProcess进入运行状态并发出started()。
QProcess允许将进程视为顺序I/O设备。可以像使用QTcpSocket访问网络连接一样,对进程进行写入和读取。然后可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。因为QProcess继承了QIODevice,所以它也可以用作QXmlReader的输入源,或者用于生成要使用QNetworkAccessManager上传的数据。
当进程退出时,QProcess重新进入NotRunning状态(初始状态),并发出finished()。
finished()信号提供进程的退出代码和退出状态作为参数,还可以调用exitCode()来获取最后一个完成的进程的退出代码,并调用exitStatus()来获取其退出状态。如果在任何时间点发生错误,QProcess将发出ErrorOccursed()信号。还可以调用error()来查找上次发生的错误类型,调用state()来查找当前进程状态。

使用QProcess调用启动指定的应用程序,如果这个应用程序在中文路径下。直接使用QProcess 调用会失败,就就算使用QProcess设置工作路径也没有用,必须切换到应用程序所在的目录下,然后使用相对路径运行。

(1)调用失败的情况

QProcess process;
process.start("D:\\\\linux-share-dir\\\\我是中文路径\\\\Program Files\\\\Release\\\\ff_video.exe -v quiet -of json -i D:/汽车零件装配.MP4  -show_streams");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba  = process.readAll();
qDebug()<<qba;

(2)切换目录解决-_chdir

QString strAppPath ="D:\\\\linux-share-dir\\\\我是中文路径\\\\Program Files\\\\Release\\\\";

qDebug() << "strAppPath:" << strAppPath;

QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
std::string name = code->fromUnicode(strAppPath).data();

QByteArray utf8_array = name.c_str();
qDebug()<<"路径切换状态:"<<_chdir(name.c_str()); //切换工作目录

QProcess process;
process.start("ff_video.exe -v quiet -of json -i \\"D:/汽车零件装配.MP4\\"  -show_streams");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba  = process.readAll();
qDebug()<<qba;

(3)切换目录解决-QDir

QDir::setCurrent("D:\\\\linux-share-dir\\\\我是中文路径\\\\Program Files\\\\Release\\\\");
QProcess process;
process.start("ff_video.exe -v quiet -of json -i \\"D:/汽车零件装配.MP4\\"  -show_streams");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba  = process.readAll();
qDebug()<<qba;

以上是关于文件名包括路径名称中的中文无法识别,的主要内容,如果未能解决你的问题,请参考以下文章

VScode配置C++出现无法识别g++问题怎么办?

无法识别颤振

docker不识别mnt

c++程序中,无法识别中文路径怎么办

Qt软件开发_解决中文路径无法识别问题

Qt软件开发_解决中文路径无法识别问题