QFTP 切换路径中文乱码的解决

来源:互联网 发布:海软订货系统源码 编辑:程序博客网 时间:2024/06/05 17:32

QFTP 切换路径中文乱码的解决

1、main函数设置 编码(测试win7)
 //设置字符编码,防止中文乱码(测试win7+win2008+win10通过)
 QTextCodec *_codec = QTextCodec::codecForName("UTF-8");
 QTextCodec::setCodecForTr(_codec);
 QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
 QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

2、转换项目 cpp、 h文件为utf8编码 
 
3、转换 编码格式转化为FTP编码格式
/*************************************************************************
*处理内容:将GBK编码格式转化为FTP编码格式
*@param:gbkCode  待转化字符串
*@return:
*@exception
**************************************************************************/
QString MyFtp::gbkCodeToFtpCode(const QString &gbkCode)
{
//    QTextCodec *codec = QTextCodec::codecForName("utf-8");
//       if (codec)
//       {
//           return codec->toUnicode(gbkCode.toLatin1());
//       }
//       else
//       {
//           return QString("");
//       }
//    //return  QString::fromLocal8Bit(gbkCode.toLatin1());

    QString TempResult;

    //1.提取数据

    //size_t InStrBufSize = gbkCode.toUtf8().size();
    size_t InStrBufSize = gbkCode.toAscii().size();

    char* InStrBuf = (char *)malloc(InStrBufSize);//= InputStr.toAscii().data();
    memset(InStrBuf, 0, InStrBufSize);
    if (InStrBuf == NULL)
    {
        return TempResult;
    }

    memcpy(InStrBuf, qPrintable(gbkCode), InStrBufSize);

    //2.建立输出缓冲
    //输出缓冲大小要比Ascii字节*2后多两个字节 用于标识输出字符串结尾
    size_t OutStrBufSize = (InStrBufSize + 1) * sizeof(QChar);
    quint16* OutStrBuf = (quint16 *)malloc(OutStrBufSize);
    if (OutStrBuf == NULL)
    {
        return TempResult;
    }
    memset(OutStrBuf, 0, OutStrBufSize);
    //3.重新编码
    size_t i = 0;
    for(i = 0; i < InStrBufSize; i++)
    {
        OutStrBuf[i] = (quint8)InStrBuf[i];
    }
    //4.数据重新组装
    TempResult = QString::fromUtf16(OutStrBuf);
    free(InStrBuf);
    free(OutStrBuf);
    return TempResult;
}


4、示例

void connectFtpServer(QString& ftpUrl)
{
 //QString ftpUrl = _ToSpecialEncoding(_ftpUrl);
 LogInfo("ftpUrl:%s", ftpUrl.toLocal8Bit().data());
 QUrl _url(ftpUrl);

 LogInfo("host:%s,user:%s,pswd:%s,path:%s", _url.host().toLocal8Bit().data(), _url.userName().toLocal8Bit().data(), _url.password().toLocal8Bit().data(), _url.path().toLocal8Bit().data());
 if (!_url.isValid() || _url.scheme().toLower() != QLatin1String("ftp"))
 {
  connectToHost(ftpUrl, 21);
  login();
 }
 else
 {
  connectToHost(_url.host(), _url.port(21));
  if (!_url.userName().isEmpty())
   login(QUrl::fromPercentEncoding(_url.userName().toLatin1()), _url.password());
  else
   login();
  if (!_url.path().isEmpty())
  {
   QString strPath = gbkCodeToFtpCode(_url.path());
   cd(strPath);
   //cd(_url.path());
  }
 }
}


原创粉丝点击