第2个问题,举个例子:比如上传“三星7月份劳务费.xls”这个文件,Delphi的AnsiToUTF8函数编码内容为:E4 B8 89 E6 98 9F 37 E6 9C 88 E4 BB BD E5 8A B3  E5 8A A1 E8 B4 B9 2E 78 6C 73   而FTP服务器传入的AFileName为:E4 B8 89 E6 98 9F 37 E6 9C 88 E4 BB BD E5 8A B3  E5 8A A1 E8 B4 3F 78 6C 73 ,显然最后一个中文本来为E8 B4 B9(三个字节),结果丢掉了B9,而2E被替换成了3F,到底是Delphi的AnsiToUTF8函数有问题,还是哪里没考虑到?

解决方案 »

  1.   

    自顶一下,没人知道为什么会出现这种编码根UTF8不完全一样的现象?
      

  2.   

    1估计是IdFTPServer有缓存函数。正好最近也在做FTP,虽然不是用indy。你可以把问题简化后上传一份.dpr,我帮你调试。另外,你连用哪个版本的delphi都不说,代码也不贴,别人怎么帮你?
      

  3.   

    首先感谢楼上的兄弟,是Delphi7 的版本,使用TIdFTPServer,我跟踪了代码的执行过程,一直追到了TIOHandlerSocket的Recv函数,它调用了WGStack 的Recv,从这里开始就是错误的,再往下我也不太想追索了,因为这下是Delphi7自身原因问题,是什么原因造成这种接受的缓存大部分像UTF8代码,有些有不像?
      

  4.   

    代码是这里扩展的,我也是抄的,http://download.csdn.net/detail/akof1314/3236325,监控那个Store事件,上传例如"三星7月",后缀名随便,Delphi7+Win7或者WinXP,一定是乱码,UTF8ToAnsi无法还原,但是上传全部是中文的文件,又是正确的。代码大体如下:
    IdFTPServer := TIdFTPServer.create( nil ) ;
    IdFTPServer.OnStoreFile := IdFTPServer1StoreFile;

    下面的AFilename有时就是乱码,像UTF8,又不完全像
    procedure TFTPServer.IdFTPServer1StoreFile(ASender: TIdFTPServerThread;
      const AFilename: string; AAppend: Boolean; var VStream: TStream);
    begin
        if FileExists( translatepath( AFileName, ASender.HomeDir ) ) and AAppend then
      begin
        VStream := TFileStream.create( translatepath( AFileName, ASender.HomeDir ) , fmOpenWrite or fmShareExclusive ) ;
        VStream.Seek( 0, soFromEnd ) ;
      end
      else
        VStream := TFileStream.create( translatepath( AFileName, ASender.HomeDir ) , fmCreate or fmShareExclusive ) ;
    end
      

  5.   

    我也在做FTPSERVER,发现INDY的FTPSERVER事件除了登录之外,只要你定义了过程,就认为操作成功,
    正在尝试用TTCPSERVER做
      

  6.   

    真心被Indy搞惨了,现在在用Indy10.1.5,上传中文问题是解决了,但是拒绝上传文件又出问题了,程序报告SOCKET 10057错误直接崩溃退出,拒绝上传的代码如下,Indy9拒绝上传没有任何问题,现在Indy 10出问题了,XXXX!!!!
             ASender.Connection.IOHandler.WriteLn('500 权限拒绝');
              ASender.Connection.IOHandler.Close;//这里该怎么通知结束????
              exit;
    try
      if FileExists(filename ) and AAppend then
      begin
        VStream := TFileStream.create(filename , fmOpenWrite or fmShareExclusive ) ;
        VStream.Seek( 0, soFromEnd ) ;
      end
      else
        VStream := TFileStream.create(filename , fmCreate or fmShareExclusive ) ;另外TTCPSERVER据说比较稳定,这个如何做FTP服务?TIdFTPServer代码那么巨大,估计不好做吧?