今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码。由于编码错误,我写了两个函数用于互相转换编码。

一个是由正常编码转为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,因此上面的代码没有区分这两个操作系统。

转换函数实现:

view plain

  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. }

view plain

  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(错误编码的字符串);

http://blog.csdn.net/leo115/article/details/7533462

Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)的更多相关文章

  1. 记录一下Vray5中文汉化版本中导出EXR或vrimg多通道文件的那些坑和解决方法

    最近在给一个培训机构代课,学生英语基础差,就安装了Vray5的中文版,噩梦从此开始. 做过合成的都知道,需要输出多通道到NUKE或者AE中进行合成,通常情况下把多个pass分成不同的文件对硬盘反复读写 ...

  2. MyEclipse 中文乱码 史诗级解决方法。也可用于其他编码

    最近发现以前写的项目全乱码了.唯独  .java 中的中文全是乱码. 由于,后期的项目把默认编码改成了UTF-8所以就乱了. 每个编码表的编码都不一样.不能直接通过改某个属性来更改达到目的 (除非你是 ...

  3. ubuntu14.04中解压缩window中的zip文件,文件名乱码的解决方法

    在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 通过unzip行命令解压,指定字符 ...

  4. WordPress中"无法将上传的文件移动至"错误的解决方法

    #chown -R www:www /wwwroot 今天在网页上传图片到博客,结果提示:“无法将上传的文件移动至 /home/wwwroot/wp-content/uploads/2013/”,郁闷 ...

  5. idea中git颜色不显示或者文件右键没有git按钮解决方法

    VCS--->Enable Version Control Integration,然后选择git就可以了

  6. Mysql插入中文的字段内容时乱码的解决方法

    Mysql插入中文的字段内容时乱码的解决方法 1.我们在往数据库插入数据的时候,当遇到中文字符的插入时会发现插入的数据会变为?号,也就是乱码,如下所示: 2.这时候我们使用如下的查询语句可以看到相应的 ...

  7. Mysql命令行中文乱码的解决方法

    环境:Windows 8 64位,Mysql  5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...

  8. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

  9. php中fopen不能创建中文文件名文件的问题

    之前网页的chartset用的是utf-8,文件也用utf-8,然后用fopen()创建一个中文文件名的文件时问题就出来了,文件名都是乱 码! 查看了很多文档试了不少方法都解决不了,本来想着用别的方法 ...

随机推荐

  1. linq中的GroupBy总结

    1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:Linq使用Group By按C ...

  2. intellj idea 如何设置类头注释和方法注释

    intellj idea 如何设置类头注释和方法注释           intellj idea的强大之处就不多说了,相信每个用过它的人都会体会到,但是我们也会被他的复杂搞的晕头转向,尤其刚从ecl ...

  3. BZOJ 1974: [Sdoi2010]auction 代码拍卖会( dp )

    在1, 11, 111……中选<=8个, + 11..(n个1)拼出所有可能...这些数mod p至多有p中可能, 找出循环的处理一下. 那么dp就很显然了...dp(i, j, k)表示前i种 ...

  4. .Net 类型、对象、线程栈、托管堆运行时的相互关系

    JIT(just in time)编译器 接下来的会讲到方法的调用,这里先讲下JIT编译器.以CLR书中的代码为例(手打...).以Main方法为例: static void Main(){ Cons ...

  5. Codeforces 706D Vasiliy's Multiset(可持久化字典树)

    [题目链接] http://codeforces.com/problemset/problem/706/D [题目大意] 要求实现一个集合中的三个操作,1:在集合中加入一个元素x,2:从集合中删除一个 ...

  6. gcc 的include path和lib path调整

    `gcc -print-prog-name=cc1plus` -v `g++ -print-prog-name=cc1plus` -v   ------------------------------ ...

  7. hdoj 2620 Bone Collector(0-1背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 思路分析:该问题为经典的0-1背包问题:假设状态dp[i][v]表示前i件物品恰放入一个容量为v ...

  8. UVA - 1103Ancient Messages(dfs)

    UVA - 1103Ancient Messages In order to understand early civilizations, archaeologists often study te ...

  9. git将本地项目添加到github远程仓库

    1.首先准备好你的github 账号密码,注册就不说了.. 2.由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以要在本地生成一个私钥和一个密钥 命令: $ ssh-keygen ...

  10. 替换Avada主题的Google字体

    刚玩WP的时候图省事,在themeforest买了排行第一的主题Avada,虽然强大,但对我目前的Blog应用而言实在太'重'了.而且老外的主题很多方面不接地气,比如谷歌字体.本文指导各位如何在Ava ...