您的位置:首页 > 编程语言 > C语言/C++

C++Builder下如何解决IdFTP控件中文名乱码问题

2018-01-09 15:31 1221 查看
(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。)

一、获取文件列表
void __fastcall TForm1::Button1Click(TObject *Sender)
{
__int64 fileSize;
AnsiString fileName;

IdFTP1->Host="22.36.26.57";
IdFTP1->Port=21;
IdFTP1->Username="csps";
IdFTP1->Password="csps";
try
{
IdFTP1->Connect();
IdFTP1->IOHandler->DefStringEncoding=IndyTextEncoding(TEncoding::Default);//此处选择编码格式,三选一。
//IdFTP1->IOHandler->DefStringEncoding=IndyTextEncoding(TEncoding::ANSI);
//IdFTP1->IOHandler->DefStringEncoding=IndyTextEncoding(TEncoding::UTF8);
}
catch(...)
{
ShowMessage("FTP连接服务器失败!");
return;
}
//
try
{
IdFTP1->List();
}
catch(...)
{
ShowMessage("FTP列举文件失败!");
return;
}
//
for(int i=0;i<IdFTP1->DirectoryListing->Count;i++)
{
fileName=IdFTP1->DirectoryListing->Items[i]->FileName;
fileSize=IdFTP1->DirectoryListing->Items[i]->Size;
Memo1->Lines->Add("文件名称:"+fileName+"  文件大小:"+String(fileSize));
}

}

二、测试结果



经测试:
1、Serv-U6.3旧版本下不能设定编码格式,在windows server2003 64位下测试发现无论用什么编码,中文都乱码;但是SERV-U新版本在全局变量那里有一个设置支持UTF8编码的地方,此时用UTF8编码就不会乱码了。
2、fileZilla这个FTP服务器挺强悍,在任何编码下都能正常显示中文名。

三、补充说明
1、对于无论设置什么编码都不能显示中文文件名的特殊情况,可以通过如下语句解决,但是只能得到文件名,得不到文件大小。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
__int64 fileSize;
AnsiString fileName;
TStringList *fileList=new TStringList;

IdFTP1->Host="22.36.26.57";
IdFTP1->Port=21;
IdFTP1->Username="csps";
IdFTP1->Password="csps";
try
{
IdFTP1->Connect();

       //第一个必须条件
IdFTP1->IOHandler->DefStringEncoding=IndyTextEncoding(TEncoding::ANSI);//此处必须设置为ANSI
}
catch(...)
{
ShowMessage("FTP连接服务器失败!");
return;
}
//
try
{
//第二个必须条件
IdFTP1->List(fileList,"",false);//第一个参数是变量,第二个参数是通配符,比如‘*,?’等,第三个参数是否显示详细信息,比如文件大小,必须为false才能显示文件名.
}
catch(...)
{
ShowMessage("FTP列举文件失败!");
return;
}
//
for(int i=0;i<IdFTP1->DirectoryListing->Count;i++)
{
fileName=IdFTP1->DirectoryListing->Items[i]->FileName;
fileSize=IdFTP1->DirectoryListing->Items[i]->Size;
Memo1->Lines->Add("文件名称:"+fileName+"  文件大小:"+String(fileSize));
}

}

2、增加头文件#include "IdAllFTPListParsers.hpp";/*解决弹屏报错:No ftp list parsers have been registered*/
3、另外,IdFTPServer控件并没有设置编码的这一属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: