廣告

2024 年 4 月
1234567
891011121314
15161718192021
22232425262728
2930  

彙整

Delphi 2010自帶TIdFTP的中文問題

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 代碼頁。

讀者也會看的其它文章:

    Comments are closed.