DELPHI7 + INDY
抓檔前先轉UTF8Encode    
filename:= UTF8Encode(filename);   
FIdFtp.Get(filename,tStream,true); 
未測試………………
==================================================================================
出處:http://hi.baidu.com/syncgrey/blog/item/8c894e823c7f78aa6c8119f1.html
1、Delphi 2010自帶TIdFTP的中文問題    
  最近使用TIdTFP,使用ChangeDir切換到中文目錄時報錯,錯誤提示中的中文目錄成了一串“?”號,閱讀源代碼得知,該控件的默認IOHandle的默認Encoding是ASCII(代碼頁為20127),ITdFTP在Connect方法中,連接成功後,有這麼一句:
    // RLebeau: must not send/receive UTF-8 before negotiating for it…    
    IOHandler.DefStringEncoding := Indy8BitEncoding;
再轉到Indy8BitEncoding 中看看:
function Indy8BitEncoding(const AOwnedByIndy: Boolean = True): TIdTextEncoding;    
var     
  LEncoding: TIdTextEncoding;     
begin     
  if not AOwnedByIndy then begin     
    LEncoding := TIdTextEncoding.GetEncoding(28591);     
  end else     
  begin     
    if GId8BitEncoding = nil then begin     
      LEncoding := TIdTextEncoding.GetEncoding( 28591);     
      if InterlockedCompareExchangePtr(Pointer(GId8BitEncoding), LEncoding, nil) <> nil then begin     
        LEncoding.Free;     
      end;     
    end;     
    LEncoding := GId8BitEncoding;     
  end;     
  Result := LEncoding;     
end;
可以看到,這裡會創建(如果還沒創建的話)返回一個代碼頁為28591 的TEncoding,那這個28591 到底是啥子呢?搜索結果如下:
28591 iso-8859-1 Western European (ISO)
原來是西歐的編碼,不支持中文就不足為奇了,那該如何處理呢?只要在調用TIdFTP.Connect 後,增加一句
TIdFTP.IOHandler.DefStringEncoding := TEncoding.Default
就正常了,注意一定要放在Connect 之後,否則會被Connect 方法重置為28591 代碼頁。

近期留言