QT使用FTP传输文件时的中文路径问题

最近有关于FTP文件传输的相关项目,因此查询相关资料编写了一个示例程序。程序运行正常,但在测试过程中使用含有中文的文件进行测试时,程序报错。

原以为是编码的问题,认为FTP不识别UTF-8编码,因此在FTP的配置项中查询,发现其对UTF斌吗是支持的。后面继续查找相关资料。找到了问题所在。(可参阅http://blog.sina.com.cn/s/blog_a0d5a7f101019hjd.html)

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

 

你可能感兴趣的:(QT使用FTP传输文件时的中文路径问题)