怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

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

最近有关于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));