1. 程式人生 > >Qt中QFtp和QURL獲取帶有中文的檔名稱出現亂碼的解決方法

Qt中QFtp和QURL獲取帶有中文的檔名稱出現亂碼的解決方法

然後在工程的main函式中,QApplication app...下一行寫如下程式碼:

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
#ifdef Q_OS_WIN
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));
#else
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
#endif
    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

注意,Windows的本地預設編碼為gbk(如果你用的是中文系統),Linux本地預設編碼為UTF-8。

因此要根據不同的作業系統來進行設定。Linux系統和Mac系統的預設編碼都是UTF-8,因此上面的程式碼沒有區分這兩個作業系統。

轉換函式實現:

  1. QString FTPCommunicator::_FromSpecialEncoding(const QString &InputStr)  
  2. {  
  3. #ifdef Q_OS_WIN
  4.     return  QString::fromLocal8Bit(InputStr.toLatin1());  
  5. #else
  6.     QTextCodec *codec = QTextCodec::codecForName("gbk");  
  7.     if (codec)  
  8.     {  
  9.         return codec->toUnicode(InputStr.toLatin1());  
  10.     }  
  11.     else
  12.     {  
  13.         return QString("");  
  14.     }  
  15. #endif
  16. }  
 
  1. QString FTPCommunicator::_ToSpecialEncoding(const QString &InputStr)  
  2. {  
  3. #ifdef Q_OS_WIN
  4.     return QString::fromLatin1(InputStr.toLocal8Bit());  
  5. #else
  6.     QTextCodec *codec= QTextCodec::codecForName("gbk");  
  7.     if (codec)  
  8.     {  
  9.         return QString::fromLatin1(codec->fromUnicode(InputStr));  
  10.     }  
  11.     else
  12.     {  
  13.         return QString("");  
  14.     }  
  15. #endif
  16. }  

當使用QFTP的put方法上傳的時候,目標檔名引數的位置使用_ToSpecialEncoding(正常編碼的字串);

當使用QFTP的get方法下載的時候,目標檔名引數位置也使用上述函式

當使用QFTP遍歷到的檔案作為本地檔名時須使用_FromSpecialEncoding(錯誤編碼的字串);