Indy メモ (IdHTTP文字化け) - Delphi 2009

Delphi2009ではIndy10 の IdHTTPを使ってHTTPドキュメントを取得すると、HTTPドキュメントのエンコード方法によっては、文字が化けてしまうことがあります。 これは、IdHTTPのGetメソッドの奥底で下記のコードがあるためです。 IdGlobal BytesToString
    if AEncoding = en8bit then
    begin
      SetLength( Result, LLength);
      for i := AStartIndex to LLength - 1 do begin
        Result[ i + 1] := Char(AValue[ i]);
      end;
    end
AEncodeingが en8bitの場合 ソケットから読み取ったバッファをすべて2バイトCharとして処理していますので、Shift-JISの2バイト全角文字も4バイトに分割されてしまい、文字が化けます。 問題を回避するには、いったんRawByteStringに積みなおすといった処理が必要です。
var  
  rs:RawByteString;   
  s:string;   
begin  
  s:=DataModule1.idhttp1.Get('http://xxxxxxxxx');   
  
  SetLength(rs,Length(s));   
  for i:=1 to Length(s)-1 do begin  
    rs[i]:=AnsiChar(s[i]);   
  end;   
  s:=rs;  
とすれば、文字化けせずに読み込めます(Shift-JISの場合)

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2008-09-30
iPentec all rights reserverd.