QFtp与中文问题

转自:https://blog.csdn.net/dbzhang800/article/details/6335818

结尾有我自己的使用情况。

 

 

本文起源
去年底看到有网友遇到QFtp的中文问题  链接 。今天在csdn中又注意到网友提问  链接 。既然这样,就将自己两次回答简单整理一下,作为一篇博客吧。

如果你对文字不感兴趣,不妨直接看看这个表:(看看网络中传递的文件路径名、QFtp提供的文件路径名、以及我们期待的文件路径名的关系)

 

 

 

(注意:本文以后可能有较大修改,如若转载,请务必注明出处。dbzhang800 2011.04.20)

古老的ftp
ftp 是一个古老的协议,ftp 在编码问题上相当笨,笨到对编码一无所知。

因为设计上如此,在现在的协议下,无法从根本上解决。所以我们使用ftp是将不可避免地遇到编码问题。

不管你是那种客户端,如果你不知道服务器采用的编码,你只能去猜测服务器采取何种编码,所以不可避免会有乱码问题(如果你用ftp,相信你深有感受)。QFtp 遇到这么笨的 ftp 也很无奈。

中文问题:

尽管这个编码问题很棘手,但是具体到简体中文,问题还是很简单的。只要服务器采用中文,要么是gb18030,要么是utf8。所以二选一,最多尝试2次即可解决问题。

QFtp的失误
我们知道:不管你的服务器编码是什么,只要整个过程中都是作为latin1来处理的,就可以保证信息不会丢失(因为latin1用全了一个字节的0~255,是字节流, 同样的方法,在早期的数据库中也被采用)。

QFtp 也是这么处理的,所有需要和服务器交互的字符串都是用的latin1的字节流。但是,它有点做过了,所有的latin1字节流,它用QString封装了一下 (个人认为是QFtp设计的严重失误,如果是都换成QByteArray将非常容易理解和使用)。

数据流
使用这些函数的时候,我们需要传递一个字符串!!

int QFtp::cd ( const QString & dir )

int QFtp::get ( const QString & file, QIODevice * dev = 0, TransferType type = Binary )

int QFtp::list ( const QString & dir = QString() )

int QFtp::login ( const QString & user = QString(), const QString & password = QString() )

int QFtp::mkdir ( const QString & dir )

...
连接到这些信号时,我们接受的数据包含一个字符串!!

void QFtp::listInfo ( const QUrlInfo & i ) [signal]

void QFtp::rawCommandReply ( int replyCode, const QString & detail ) [signal]

这有神马问题么?你有没有这样的疑问。答案是,没有问题,只要你不介意你的用户看到的是乱码,QFtp工作一切都很正常。

处理中文
我们通过某种方式已经知道了服务器采用的编码了,比如是gb18030,那么客户端如何正常显示出中文呢?

在Qt中,我们在客户端处理文件名等字符串时,使用的是包含正确信息QString,QFtp中用的也是QString(字节流的封装)。这中间需要一个转换,QString 和 QString 的转换!!

 

 

 

 
换种表达方式:(以服务端采用utf8为例)

下行字符串:使用 QString::toLatin1() 得到字节流,然后解码该字节流 QString::fromUtf8 ,得到正确的QString
上行字符串:使用 QString::toUtf8 得到字节流,解码字节流QString::fromLatin1 得到需要传递的 QString
 
————————————————
版权声明:本文为CSDN博主「dbzhang800」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dbzhang800/article/details/6335818

 

个人使用过程:

我使用filezilla再win10上搭建一个ftp服务器。在另一台win10上使用qt开发一个客户端程序(mingw的,编码默认utf8),在连接成功后,毫无意外的,中文都成了乱码。按照上面方法

接收ftp文件列表:

 

 

 发送请求:

 

posted @ 2021-05-31 11:14  阳光下的小土豆  阅读(542)  评论(0编辑  收藏  举报