QT打開文件路徑中含有中文和空格問題


使用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本身就支持帶空格的文件名輸入,不需要轉換……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM