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 代碼頁。
近期留言