本文起源
去年底看到有网友遇到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
分享到:
相关推荐
在QT4框架中,QFTP类提供了一个方便的接口来处理FTP(文件传输协议)操作,如上传、下载、删除文件以及管理文件夹。本文将详细介绍如何使用QFTP类实现这些功能。 首先,QFTP是QT4网络模块的一部分,它基于...
与上一个版本相比 解决了“汉字文件”上传 以及获取时乱码的问题 ">1 自动文件上传(断点续传) 需要在上传文件之前调用QFtp下的list 通过listInfor 信号 获取当前要上传的文件是否存在 如果存在 比较大小 或者通过...
最近在做一个项目也是用到了QFtp上传文件到别人的服务器,突然就想到了要做一个简单的客户端实现其基本的功能,于是在闲暇时就慢慢的把功能给加上去了,虽然有点简陋但是还是实现了有不少的功能,当然也包括了前面...
5. **解决中文乱码问题**:考虑到中文字符在传输过程中可能出现乱码,客户端采用了适当的编码转换策略,确保中文文件名在传输前后保持正确显示。这可能涉及到设置正确的字符编码,如UTF-8,并在传输文件名时进行适当...
4. **解决中文文件名乱码问题**:在Windows环境下,处理非ASCII字符(如中文)可能会遇到编码问题。在FTP客户端中,开发人员可能通过设置正确的字符编码,比如使用`QTextCodec::setCodecForCStrings()`和`QTextCodec...
**** 已有更新版本,请下载新版本 **** 本程序可列出 FTP 服务器的全部目录结构,并将其树状结构以文本格式输出,具有以下特点: 1、使用单线程连接 FTP,...若有其它问题,欢迎与我联系交流:heweiqi0086@126.com,^_^
- **QFtp** - 提供了FTP协议的支持。 - **QTcpSocket** - 提供了TCP套接字的客户端和服务器端功能。 - **QTcpServer** - 用于创建TCP服务器。 #### 七、进阶议题 **7.1 多执行绪(Multithreading)** - **...
实现目标机中含中文名称自动转码,有些系统编码方式不同,下载出来的文件会乱码 实现ftp功能保活,在正常使用时ftp如果挂载超过5分钟会自动断开 此资源为qt5.7的代码cpp文件和相关main函数和结构体定义h文件,需要...
- **QFtp:** - FTP客户端功能。 - **QTcpSocket:** - TCP套接字编程。 - **QTcpServer:** - TCP服务器端编程。 #### 七、进阶议题 - **进阶议题概述:** - Qt提供了许多高级功能,如多线程、国际化等,这些...