最近有关于FTP文件传输的相关项目,因此查询相关资料编写了一个示例程序。程序运行正常,但在测试过程中使用含有中文的文件进行测试时,程序报错。
原以为是编码的问题,认为FTP不识别UTF-8编码,因此在FTP的配置项中查询,发现其对UTF斌吗是支持的。后面继续查找相关资料。找到了问题所在。(可参阅新浪博客)
Windows的本地默认编码为gbk(如果你用的是中文系统),Linux本地默认编码为UTF-8。而我们现在使用的QT编码一般设置为UTF-8,因此当进行文件传输时,FTP服务器将路径以gbk编码方式进行解码。当路径不含中文时,还没什么影响,但当路径含有中文时,无论是文件名含有中文,还是目标文件夹路径含有中文,都会发生以上路径无法被正确识别的问题。修改如下:
//将gbk编码的字符串改为UTF-8编码,在获取FTP服务器下文件时使用
QString FromSpecialEncoding(const QString &InputStr)
{
#ifdef Q_OS_WIN
return QString::fromLocal8Bit(InputStr.toLatin1());
#else
QTextCodec *codec = QTextCodec::codecForName("gbk");
if (codec)
{
return codec->toUnicode(InputStr.toLatin1());
}
else
{
return QString("");
}
#endif
}
//将UTF-8编码的字符串改为gbk编码,在由客户端上传或下载文件时使用
QString ToSpecialEncoding(const QString &InputStr)
{
#ifdef Q_OS_WIN
return QString::fromLatin1(InputStr.toLocal8Bit());
#else
QTextCodec *codec= QTextCodec::codecForName("gbk");
if (codec)
{
return QString::fromLatin1(codec->fromUnicode(InputStr));
}
else
{
return QString("");
}
#endif
}
这里以文件上传为例,在上传过程中,涉及到路径的代码为QURL中设置目标文件路径,假设原代码为:
QUrl url;
//设置通讯协议
url.setScheme("ftp");
//设置用户名
url.setUserName("user");
//设置密码
url.setPassword("pwd");
//设置主机,也可以是域名
url.setHost("192.168.1.1");
//设置端口号,一般为21
url.setPort(21);
//设置路径
QString path="\\新建文件夹\\新建文本文档.txt";
url.setPath(path);
该代码旨在将新建文本文档.txt文件由客户端上传到服务器根目录下的子文件夹“新建文件夹”下,因为其原始文件名及目标路径都含有中文,因此直接使用以上代码会报错。修改如下:
QUrl url;
//设置通讯协议
url.setScheme("ftp");
//设置用户名
url.setUserName("user");
//设置密码
url.setPassword("pwd");
//设置主机,也可以是域名
url.setHost("192.168.1.1");
//设置端口号,一般为21
url.setPort(21);
//设置路径
QString path="\\新建文件夹\\新建文本文档.txt";
url.setPath(ToSpecialEncoding(path));