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());
}
}
}