`
tomhibolu
  • 浏览: 1383425 次
文章分类
社区版块
存档分类
最新评论

QFtp 与中文问题

 
阅读更多

本文起源

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

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

网络传递的

(字节流)

QFtp接口提供的

(字符串)

中间态字节流
(原始字节流)

我们操作的

(字符串)

QByteArray

====>

QString

====>

QByteArray

====>

QString

<====

<====

<====

latin1编解码

latin1编解码

gb18030(或utf8)

QFtp内部动作

程序员的责任

QFtp的自作聪明

抵消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 的转换!!

网络传递的字节流

QFtp接口

中间态字节流

我们操作的字符串

QByteArray

====>

QString

====>

QByteArray

====>

QString

<====

<====

<====

latin1编解码

latin1编解码

gb18030(或utf8)

QFtp内部动作

程序员的责任

QFtp的自作聪明

抵消QFtp的自作聪明

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

  • 下行字符串:使用 QString::toLatin1() 得到字节流,然后解码该字节流 QString::fromUtf8 ,得到正确的QString
  • 上行字符串:使用 QString::toUtf8 得到字节流,解码字节流QString::fromLatin1 得到需要传递的 QString

分享到:
评论

相关推荐

    qt-qtftp.tar.gz_QT5 QFtp_linux 编译qftp_qftp_qt5 qftp linux_qtftp使

    Qt5中移除QFtp API,自己编译Qftp,加载使用

    QFtp实现批量文件上传

    示例包含了FTP登录,为方便演示,本次连接的FTP服务器就是上篇文章中介绍的在windows本机搭建的FTP服务器。Demo功能包括:选择文件夹进行批量上传...其实QFTP还提供了很多其他接口,用法都是差不多的,可以举一反三。

    qt5 qftp官方源码

    qt5 qftp, qt5 qftp,qt5 qftp,qt5 qftp,qt5 qftp ftp list cd mkdir rmdir get down

    Qt5+Qftp简单Demo

    QT5+Qftp简单实现,有问题可以私聊解答互相交流!

    Qt_QFtp下载文件夹类

    借鉴网传的方法,自己写的QFtp下载文件夹功能类,包含.H和CPP,传入构造函数的几个参数即可使用,有注释,希望能帮到有需要的人;

    Qt5.0版本实现QFtp

    由于Qt5.0以上的版本把QFtp类移除了,导致不能使用QFtp.于是把Qt4.8.7的QFtp类型的源码,提成两个文件,一个QFtp.h,一个QFtp.cpp,把这两个文件添加到工程中,就可以使用QFtp类了.

    Qt实现QFtp

    在Qt5.0以上实现QFtp,由于Qt5.0以上没有QFtp类,所以从Qt4.8.7把QFtp的源码提取出来,提取成两个文件QFtp.h和QFtp.cpp,然后写了这个测试例子,例子实现了登录FTP服务器,实现上传文件、删除文件、创建文件、重命名...

    QFtp-source.rar

    QFtp源码文件,已经修改过编码问题,直接引用到自己项目中就可以使用,无需编译成动态库。

    qt中qftp源码

    qt中qftp源码

    QT5 下的 QFTP 文件包

    从 Qt5.x 之后,QFTP 从 QT 库中被移除,若想用,需要下载源码自行编译 这里提供 QFTP 文件,与使用示例

    qt5 qftp编译

    在github官方下载的源码,没有导出宏,qurlinfo.h在当前目录下使用,DEFINES += FTP_LIB,qtftp-master\src\qftp\qftp.pro文件加宏DEFINES += FTP_LIB

    QFtp客户端

    QFtp客户端,实现远程时的下载,删除,重名,新建,列表功能

    QFtp源码+VS2015项目文件+64位编译

    文件里包含了QFtp的源码, 以及自己导入源码创建的vs2015的项目文件, 有需要的可以自己编译相应的版本,我自己已经编译好了vs2015 64位的lib库了,下下来可以直接用

    使用QFtp下载远程Ftp文件实例源代码

    使用QFtp下载远程Ftp文件实例源代码

    QFtp module for Qt5

    Qt的QFtp模块源码,编译后可用于Qt5编程,亲测Qt5.12可正常使用。

    QFTP库,qfter,C/C++

    QT5为了提高其质量去掉了QFtp

    qftp_master.zip

    QT5不再直接支持qftp功能,为了方便开发人员使用,此源代码可在Qt5以上进行编译;作为动态库进行使用

    Qt5 QFtp普通文件断点续传

    与上一个版本相比 解决了“汉字文件”上传 以及获取时乱码的问题 "&gt;1 自动文件上传(断点续传) 需要在上传文件之前调用QFtp下的list 通过listInfor 信号 获取当前要上传的文件是否存在 如果存在 比较大小 或者通过...

    QFtp下载文件夹.zip

    利用QT的QFtp类下载文件夹,希望可以帮到有需要的人。

Global site tag (gtag.js) - Google Analytics