FTP服务器在收到List指令后,会把当前文件夹的所有项目(包括文件夹和文件的名称,大小,时间,所有者等相关信息)列举出来并返回给FTP客户端。曾经在网上看到有人说过这样一句话:“ftp 在编码问题上相当笨,笨到对编码一无所知”。确实,多数FTP服务器在返回这些名称时采用的文字编码格式为ANSI。这是一个不太好的格式,英文字符占用一个字节存储空间,非英文字符占用两个字节存储空间,长度不一致。而Qt的默认文本编码采用的UTF-16(是么?这里不太肯定,反正从实验得到的数据来看至少是这样的)。即每个字符占据两个字节的存储空间。当QFtp从FTP服务器获取到当前目录下的项目信息时,名称部分直接粗暴地一个个地拆分成了UTF-16格式,并认为这些数据就是UTF-16格式的数据。那么当然不管你如何对其进行转换,数据本身都是错的,又怎么会得到正确的中文显示呢?所以,我们需要对这些数据进行特别的整理。
由于编码错误,我写了两个函数用于互相转换编码。
一个是由正常编码转为QFTP上所谓的“乱码”的:QString _ToSpecialEncoding(const QString &InputStr);
另一个是由QFTP乱码转换为正常编码的:QString _FromSpecialEncoding(const QString &InputStr);
需要注意的是,使用这个函数之前,你的应用程序应该在界面上能正常显示中文。我是这样来实现的:
首先考虑到代码跨平台,而且主要在Linux平台下运行。因此特别设置了QtCreator的文件默认编码为UTF-8。
也就是说工程中的.cpp和.h文件内部字符编码格式为UTF-8。
然后在工程的main函数中,QApplication app...下一行写如下代码:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8")); #ifdef Q_OS_WIN QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk")); #else QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8")); #endif QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
注意,Windows的本地默认编码为gbk(如果你用的是中文系统),Linux本地默认编码为UTF-8。
因此要根据不同的操作系统来进行设置。Linux系统和Mac系统的默认编码都是UTF-8,因此上面的代码没有区分这两个操作系统。
转换函数实现:
- QString FTPCommunicator::_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
- }
- QString FTPCommunicator::_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
- }
当使用QFTP的put方法上传的时候,目标文件名参数的位置使用_ToSpecialEncoding(正常编码的字符串);
当使用QFTP的get方法下载的时候,目标文件名参数位置也使用上述函数
当使用QFTP遍历到的文件作为本地文件名时须使用_FromSpecialEncoding(错误编码的字符串);
相关推荐
FTP上传文件,FTP解决乱码问题 解决乱码讲new String(s.getBytes("gbk"),"ISO8859-1");//其转换后还是乱码 改成国际中文标准码就行了
虽然QFtp在Qt5.0之后就被官方移除了,但是其基本功能还是挺全的,虽然在上传下载文件的时候带中文时会乱码,但也是能解决的。 最近在做一个项目也是用到了QFtp上传文件到别人的服务器,突然就想到了要做一个...
**基于Qt实现的简单FTP客户端**是一个利用QT4.8框架中的QFtp类构建的FTP文件传输应用程序。QFtp是Qt库提供的一种用于FTP通信的类,它提供了丰富的功能,使得开发者能够轻松地在应用程序中实现FTP协议的相关操作。 ...
书中可能讲解了如何设置正确的编码、处理多语言支持以及解决字符乱码问题的策略。 学习Qt开发需要掌握的基本概念和技巧包括: - **信号与槽机制**:这是Qt的核心特性,允许对象间进行通信,无需知道彼此的具体实现...
- `中文乱码问题解决办法.txt`可能提供针对不同场景的解决方案。 10. **源码使用说明** - `源码使用说明.txt`会指导如何编译和运行提供的源码,了解项目结构和依赖关系。 11. **版权声明** - `版权声明.txt`...
5. **解决中文乱码问题**:考虑到中文字符在传输过程中可能出现乱码,客户端采用了适当的编码转换策略,确保中文文件名在传输前后保持正确显示。这可能涉及到设置正确的字符编码,如UTF-8,并在传输文件名时进行适当...
与上一个版本相比 解决了“汉字文件”上传 以及获取时乱码的问题 ">1 自动文件上传(断点续传) 需要在上传文件之前调用QFtp下的list 通过listInfor 信号 获取当前要上传的文件是否存在 如果存在 比较大小 或者通过...
总而言之,这个基于Qt5.9开发的文件编码转换工具,能够帮助用户批量处理UTF-8与GB2312编码的转换,解决因编码不匹配导致的乱码问题。同时,由于采用了Qt框架,该工具具备了跨平台、丰富的功能集以及良好的用户体验。...
对于使用锐捷网络认证的用户,在Ubuntu中配置可能会稍显复杂,但依然可以解决: 1. 下载myxrgsu工具,可以从http://www.linuxidc.com/upload/2008_06/08062807082818.zip获取。 2. 解压myxrgsu,打开终端,通过...
文件提到了VI功能增强、安装卸载DEB包、解决SecureCRT中文显示乱码等问题,这些都是在Ubuntu环境下开发时可能会遇到的实际问题。掌握这些工具的使用,能够提高开发效率和解决开发中遇到的问题。 7. **特定问题的...
5. **安全性**:FileZilla支持FTP over TLS/SSL和SFTP(SSH文件传输协议),这两种安全模式可以确保数据传输过程中的加密,保护用户的数据安全。 6. **自定义设置**:用户可以根据自己的需求调整各种设置,如传输...
在安装向导中,选择你要安装Ubuntu的磁盘分区,确保分配足够的空间(至少8GB),并设定语言为简体中文。接着,创建用户名和密码,点击“安装”按钮开始安装过程。 4. 电脑重启后,你会看到启动菜单,选择Ubuntu进入...
Notepad++是一款非常受欢迎的免费源代码编辑器,尤其在Windows操作系统中被广泛使用。它支持多种编程语言,包括但不限于C、C++、Java、Python、PHP、HTML、XML等,为开发者提供了便利的代码编写环境。这款工具以其轻...
进程是Linux中的一个核心概念,这一章可能讲述了如何创建、管理进程,包括进程的创建(fork)、进程间的通信(管道、消息队列、共享内存等)以及进程状态的切换。 3. **第8章:进程间通信(IPC)** 在多进程环境...