用户登录
用户注册

分享至

QT打开文件路径中含有中文和空格问题

  • 作者: 张庄刘二蛋
  • 来源: 51数据库
  • 2021-10-24

使用qt-mingw版做的软件,发给客户以后说工作不正常,配置文件无法打开,或者加载数据文件不正常。远程查看以后,发现客户经常将程序放置在中文带空格的路径下,导致文件打开不正常。所以最近想在程序上解决一下,让客户少出问题。

首先在网上查了qt打开文件路径中含有中文和空格问题,抄了如下代码:(https://blog.csdn.net/m0_37906001/article/details/76672634)

 1     qstring filename=qfiledialog::getopenfilename(this,tr("open image"),".",tr("image files(*.png *.jpg *jpeg *.bmp *.avi *.mp4)"));
 2  
 3     qtextcodec *code = qtextcodec::codecforname("gb2312");//解决中文路径问题
 4     std::string name = code->fromunicode(filename).data();
 5  
 6     if(filename.isempty())
 7     {
 8             return;
 9     }
10  
11     inputvideo.open(name);//我准备打开的是本地视频文件

非常简单于是就加在自己代码里了:

 1 if(ui->bt_replay->text()=="回放")
 2 {
 3     auto name=qfiledialog::getopenfilename(0,"","","pcap文件(*.pcap)");
 4     qtextcodec *code = qtextcodec::codecforname("gb2312");//解决中文路径问题
 5     name = code->fromunicode(name).data();
 6     cout<<"convert gb2312:"<<name.tostdstring()<<endl;
 7     if(name!="")
 8     {
 9 
10         lctrl.replay_dat(name.tostdstring());
11         ui->bt_replay->settext("退出回放");
12         lctrl.replay_stat=1;
13         ui->lb_replay_stat->settext("加载数据");
14     }
15 }

结果不行。认为是编码问题,换了编码,加了编码成功的判断,无论如何也不行,但是在网上搜到的代码都非常简单。

最后发现,qstring的存储是按unicode存的,输入的时候会把输入数据转换成unicode,转码方式默认是latin-1,导致转码以后的文件名又被转回去了,而且转的还不对

于是使用std::string解决这个问题:

 1 if(ui->bt_replay->text()=="回放")
 2 {
 3     auto name=qfiledialog::getopenfilename(0,"","","pcap文件(*.pcap)");
 4     qtextcodec *code = qtextcodec::codecforname("gb2312");//解决中文路径问题
 5     string namestd = code->fromunicode(name).data();
 6     cout<<"convert gb2312:"<<namestd<<endl;
 7     if(namestd!="")
 8     {
 9         lctrl.replay_dat(namestd);
10         ui->bt_replay->settext("退出回放");
11         lctrl.replay_stat=1;
12         ui->lb_replay_stat->settext("加载数据");
13     }
14 }

对于路径中存在空格的,在网上查的解决方法是:path.replace(" ","" "");

结果试了不行,最后发现,fopen本身就支持带空格的文件名输入,不需要转换……

软件
前端设计
程序设计
Java相关