Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)

今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码。于是我深入地对这一现象进行了研究。这里先简单介绍一下我的分析过程:

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,因此上面的代码没有区分这两个操作系统。

转换函数实现:

[cpp] view plain copy

  1. QString FTPCommunicator::_FromSpecialEncoding(const QString &InputStr)
  2. {
  3. #ifdef Q_OS_WIN
  4. return  QString::fromLocal8Bit(InputStr.toLatin1());
  5. #else
  6. QTextCodec *codec = QTextCodec::codecForName("gbk");
  7. if (codec)
  8. {
  9. return codec->toUnicode(InputStr.toLatin1());
  10. }
  11. else
  12. {
  13. return QString("");
  14. }
  15. #endif
  16. }

[cpp] view plain copy

  1. QString FTPCommunicator::_ToSpecialEncoding(const QString &InputStr)
  2. {
  3. #ifdef Q_OS_WIN
  4. return QString::fromLatin1(InputStr.toLocal8Bit());
  5. #else
  6. QTextCodec *codec= QTextCodec::codecForName("gbk");
  7. if (codec)
  8. {
  9. return QString::fromLatin1(codec->fromUnicode(InputStr));
  10. }
  11. else
  12. {
  13. return QString("");
  14. }
  15. #endif
  16. }

当使用QFTP的put方法上传的时候,目标文件名参数的位置使用_ToSpecialEncoding(正常编码的字符串);

当使用QFTP的get方法下载的时候,目标文件名参数位置也使用上述函数

当使用QFTP遍历到的文件作为本地文件名时须使用_FromSpecialEncoding(错误编码的字符串);

使用环境:

Windows XP SP3 + IIS 作为FTP服务器。

下载程序运行在Windows XP SP3 和 Ubuntu 10.10。两操作系统均测试通过。若使用其他FTP服务器,设置使用ASCII编码的也可通过。

http://blog.csdn.net/chaijunkun/article/details/6293107

时间: 2024-11-01 17:26:05

Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)的相关文章

U盘文件名称变成乱码的解决方法

不知道小伙伴们在使用U盘的时候有没有遇到过这样的情况,打开U盘后,里面的文件名称变成乱码,点击删除时,弹出提示无法删除,这是神马情况?我们需要如何来解决呢? 小编现在教你一个解决乱码问题的方法: U盘文件名称乱码 点击”开始——运行“,输入chkdsk H:/f(H为U盘盘符),该命令会自动检查出U盘出现的很多问题,如果是乱码问题,可能会有提示修改文件夹的文件名,此时输入Y选择是,如果U盘中很多出现乱码的文件夹,那么就要经过多次选择是,操作完毕后,打开U盘,你会发现里面文件夹的文件名正常了. 出

php ci框架中加载css和js文件失败的原因及解决方法

在将html页面整合到ci框架里面的时候,加载css和js失败.原因是ci框架是入口的框架 对框架中文件的所有请求都需要经过index.php处理完成,当加载外部的css和js文件的时候要使 用base_url()函数处理外部的链接. 在控制器中需要先载入url相关的类 public function test() { $this->load->helper('url'); $this->load->view('admin/test'); } 在test.php的view视图中.

mybatis中一直获取xml配置文件输入流值为空的类似解决方法

第一个问题:一直在 InputStream stream = StudentDaoImpl.class.getClassLoader().getResourceAsStream("config.xml");返回null,后来发现是resource不能编译到class文件中,在pom中添加 <resources> <!-- 不编译resources下的配置文件 --> <resource> <directory>src/main/resou

Qt 中一些常用类中文说明

Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进制的数据 QDataWidgetMapper 提供了从数据模型到部件的映射 QData 日期的功能 QDateEdit 提供了日期的部件用来编辑日期,是基于QDateTimeEdit 部件 QDateTime 提供日期与时间的功能 QDateTimeEdit 提供了编辑日期与实践的部件 QDBusA

ubuntu 中用vim打开txt等文件中文显示乱码的解决方法 &nbsp;

今晚用ubuntu 12.04 的vim编辑网页代码时,发现上面的中文显示乱码.这个html文件是我之前用gedit编辑的,在gedit里面显示正常,可是在vim下显示就是乱码了. 怎么解决ubuntu中vim显示中文乱码的问题呢? 首先,添加中文字符编码: sudo gedit /var/lib/locales/supported.d/local 在打开的文件中添加下面的中文字符集 zh_CN.GBK GBK zh_CN.GB2312 GB2312 zh_CN.GB18030 GB18030

Mac 中显示资源库(Library)文件夹目录的几种方法

Mac 中显示资源库(Library)文件夹目录的几种方法 Mac中Library目录在10.6.7系统之后默认隐藏的,要想找到此文件夹有如下几种方法: 1. 用命令可以使其显示: 在终端中执行命令: chflags nohidden ~/Library 可显示资源库文件夹 如想隐藏,可以在终端中执行命令: chflags hidden ~/Library 隐藏 2. 在Finder菜单中的偏好设置中设置 在Finder菜单中的偏好设置中选择边栏,勾选上设备中的硬盘. 再打开Finder,Fin

js兼容ie获取上传excel文件名称以及大小,绝对路径

/**  *   * @param obj file对象 document.getElementById(elementId);  * @returns  */ function getExcelFileFullPath(obj){ if (obj){ // ie if (window.navigator.userAgent.indexOf("MSIE") >= 1){ obj.select(); return document.selection.createRange().t

项目中出现paxheader文件夹,里面的文件名称是乱码,是不是病毒?

最近从SVN上Check下来的一个项目中包含paxheader文件夹,里面的文件名称是乱码,是不是病毒呢? 经过网上一番搜索,结合公司有人使用Linux系统的情况,总结可能的原因是代码之前是在Linux系统下写的,可能是在Linux系统下打成tar.gz包发到Windows系统下然后解压出来 的,由于tar.gz的一些特性Windows下的解压软件支持的不好,所以才形成了paxheader文件夹. 参考: http://lists.freebsd.org/pipermail/freebsd-cu

php上传文件中文文件名乱码的解决方法

想必很多朋友在进行utf8编码的php开发上传功能的时候,都会遇到这样的一个问题,就是上传中文文件名的文件时,文件名会变成乱码,其实我们可以用iconv函数对文件名进行重新编码就解决问题了 可能会有不少朋友碰到一些问题就是上传文件时如果是英文倒好原文名不会有问题,如果是中文可能就会出现乱码了,今天我来给大家总结一下导致乱码php上传文件中文文件名乱码的原因与解决办法吧. 这几天在windows下安装了XAMPP,准备初步学习一下php的相关内容.这几天接触到了php上传文件,但是出现了一个郁闷问