2012/09/25

Indy10 IdHTTP對非英文語的處理方式(泛中文處理)

這陣子想從網路上下載一些文件,URL大致上像下面這句:

「sUrl := http://www.DelphiCpp.com/我愛Delphi.txt」

使用 IdHTTP.Get(sUrl, ms) 方法卻怎麼也抓不到,可是也沒有Exception…

李組長眉頭一皺,發現案情並不單純。

於是請了Google大神拜了一下,也發現不少災情。

请问Delphi7怎么解决Indy发送中文字符的问题
Thread: IdHTTP and æøå ??

發現共通點都是靠「TIdTextEncoding」來解決問題
所以原先的作法就修改成這樣:

  IdHttp.IOHandler.DefStringEncoding := TIdTextEncoding.ANSI;
  IdHttp.Get(sUrl, msNewFile);

然後呢~

就完成啦!

才怪!

根本就不行!

執行到IdHttp.IOHandler.DefStringEncoding := TIdTextEncoding.ANSI;這行就出錯了。

原因在 IdHttp.IOHandler = NULL

李組長眉頭要皺到爆炸啦!

又參閱了下面文章

Converting Delphi 2007 Indy 10.2.3 to Delphi 2009 Indy 10.5.5
D2009 IdhTTp inavlid code page

既然要指定,就給它一個吧,於是就產生下一段這樣的內容:

  if IdHTTP.IOHandler = nil then
    IdHTTP.IOHandler := TIdIOHandler.MakeDefaultIOHandler(IdHTTP);
  IdHttp.IOHandler.DefStringEncoding := TIdTextEncoding.ANSI;
  IdHttp.Get(sUrl, msNewFile);

呼呼…試到這邊總算是可以成功了

至於為什麼不是使用
  TIdTextEncoding.ASCII
  TIdTextEncoding.UTF8
這兩種方法

在這邊的網站有提到
URL 含中文路徑名稱的終極解法

應該是與Web Server的調整有關,所以我試到 TIdTextEncoding.ANSI 就成功了
其它的,還希望有試過的人回應啦!



2012/10/05更新:
Look at indy IdURI unit, it has two static methods in the TIdURI class for Encode/Decode the URL.
uses
  IdURI;
..
begin
  S := TIdURI.URLEncode(str);
//
  S := TIdURI.URLDecode(str);
end;

感謝Sryang大提供資訊!
資料來源:Standard URL encode function?





Indy 真是太棒啦! (無誤)

沒有留言:

張貼留言