Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)
今天研究了一下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,因此上面的代码没有区分这两个操作系统。
转换函数实现:
- 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(错误编码的字符串);
http://blog.csdn.net/leo115/article/details/7533462
Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)的更多相关文章
- 记录一下Vray5中文汉化版本中导出EXR或vrimg多通道文件的那些坑和解决方法
最近在给一个培训机构代课,学生英语基础差,就安装了Vray5的中文版,噩梦从此开始. 做过合成的都知道,需要输出多通道到NUKE或者AE中进行合成,通常情况下把多个pass分成不同的文件对硬盘反复读写 ...
- MyEclipse 中文乱码 史诗级解决方法。也可用于其他编码
最近发现以前写的项目全乱码了.唯独 .java 中的中文全是乱码. 由于,后期的项目把默认编码改成了UTF-8所以就乱了. 每个编码表的编码都不一样.不能直接通过改某个属性来更改达到目的 (除非你是 ...
- ubuntu14.04中解压缩window中的zip文件,文件名乱码的解决方法
在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 通过unzip行命令解压,指定字符 ...
- WordPress中"无法将上传的文件移动至"错误的解决方法
#chown -R www:www /wwwroot 今天在网页上传图片到博客,结果提示:“无法将上传的文件移动至 /home/wwwroot/wp-content/uploads/2013/”,郁闷 ...
- idea中git颜色不显示或者文件右键没有git按钮解决方法
VCS--->Enable Version Control Integration,然后选择git就可以了
- Mysql插入中文的字段内容时乱码的解决方法
Mysql插入中文的字段内容时乱码的解决方法 1.我们在往数据库插入数据的时候,当遇到中文字符的插入时会发现插入的数据会变为?号,也就是乱码,如下所示: 2.这时候我们使用如下的查询语句可以看到相应的 ...
- Mysql命令行中文乱码的解决方法
环境:Windows 8 64位,Mysql 5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...
- Qt 中一些常用类中文说明
Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...
- php中fopen不能创建中文文件名文件的问题
之前网页的chartset用的是utf-8,文件也用utf-8,然后用fopen()创建一个中文文件名的文件时问题就出来了,文件名都是乱 码! 查看了很多文档试了不少方法都解决不了,本来想着用别的方法 ...
随机推荐
- JavaSE思维导图(七)
- sqlserver字符串拆分(split)方法汇总
--方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5,6,7,8,9,10'set @sql='select ...
- 怎样在UICollectionView中添加Header和footer
---恢复内容开始--- 怎样在UICollectionView中添加Header和footer 转载于http://my.oschina.net/zboy/blog/221525 摘要 来自-htt ...
- A - 数塔
A - 数塔 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- BZOJ 2302: [HAOI2011]Problem c( dp )
dp(i, j)表示从i~N中为j个人选定的方案数, 状态转移就考虑选多少人为i编号, 然后从i+1的方案数算过来就可以了. 时间复杂度O(TN^2) ------------------------ ...
- SQL Server Mysql primary key可更新性分析
SQL Server: 一般来说SQL Server 中表的主键是支持更新操作的.但是如果这个主键是由identity(1,1)这类的方式生成的话它是不可更新的. Mysql : Mysql 中表的主 ...
- QT中静态库的生成与使用——创建共享库代码,附例子
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- CCNP路由实验(1) -- EIGRP
EIGRP(Enhanced Interior Gateway Routing Protocol,增强型内部网关路由协议)是Cisco公司开发的一个平衡混合型路由协议,它融合了距离向量和链路状态两种路 ...
- 深入浅出Win32多线程程序设计之基本概念
一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...
- POJ 3261 Milk Patterns(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=3261 [题目大意] 求最长可允许重叠的出现次数不小于k的子串. [题解] 对原串做一遍后缀数组,二分子串长度x,将前缀相同长度超过 ...