菜鳥有感:コードよ、コード!最終的な解決策は、これ以上悩まないでください.


idhttpのWebソースコードの取得問題については、ここで最後の解決方法を記録し、これ以上葛藤したくなく、二度と傷つけられない.(本明細書の内容はいずれもd 2010,indy 10.55の環境下で発生および終了する).
ネット上でidhttpがホームページの文字化けしを取ることについて検索するだけで、idyttpの符号化の問題の文章はたくさんあって、無数に試して、すべて満足していないで、最後にここで個人の解決方法を記録します.
IDEには、str:=httpと書く.get(xxxxx);次にCtrlがgetを追跡すると、ソースコードに次の行が得られ、最も重要な行になります.
Result := ReadStringAsCharset(LResponse, Response.CharSet);

明らかにidhttpは私たちに良いことをしようとして、直接復号後(正常に読むことができて、文字化けしていません)の内容に戻って、問題が来て、Response.CharSetに値がある場合、返される内容は完全に正しい、Response.CharSetに値がない場合、返される結果は議論に値する.そこでネット上でよく聞かれる「なぜUTF-8の場合、返却内容は正常なのですが、GBKの場合はだめなのですか?」という質問がありました.私がテストした結果、ウェブページがUTF-8の場合、Response.CharSet='utf-8'で、ウェブページがGBKである場合、Response.CharSetは必ずしもGBKではなく、空の場合が多いですが、この場合、上記の関数を使用する場合、CharSetは西欧(可能でしょう)符号化にデフォルト設定されており、得られる内容はUTF-8符号化後の結果よりも分かりにくいです.だから、私たちがしなければならないのは、CharSetに利用可能な正しい値を与えることです.
利用可能な正しいCharSet値が得られたら?まず、idhttp.Response.CharSetこれが優先ですが、この値が空の場合は、返されるHTMLで探す必要があります.
<html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title> Application.Terminate , OnDestroy - - </title>
<link type="text/css" rel="stylesheet" href="http://www.cnblogs.com/css/common.css"/>

上のコードの目立つ部分、charset=utf-8、私たちが欲しいのはこれです.この部分は英語なので、どんなコードでも正常にこの部分の内容を得ることができます.必要なのは、charset=の後ろの内容を正則で取り出し、具体的なコードを判断することです.一般的には、utf-8とgbkの2つの状況を考慮する必要があります.実現コードは以下の通りです.
function Txxxxxx.getMethod(AURL: string): string;
var
LResponse: TMemoryStream;
LEncoding:TIdTextEncoding;
per:TPerlRegEx;
begin
LResponse := TMemoryStream.Create;
try
try
http.Get(AURL, LResponse);
finally
http.Disconnect;
end;
LResponse.Position := 0;
if http.Response.CharSet<>'' then
begin
LEncoding := CharsetToEncoding(http.Response.CharSet);
if AnsiSameText(http.Response.CharSet,'utf-8') then
isutf8:=true
else isutf8:=False;
end
else
begin
LEncoding := TEncoding.Default;
Result := ReadStringFromStream(LResponse, -1, LEncoding);

per:=TPerlRegEx.Create(nil);
per.Options:=[preCaseLess];
per.Subject:=Result;
per.RegEx:='<meta[\S\s]*?charset=(.*)>';
if per.Match then
begin
if AnsiContainsText(per.MatchedExpression,'utf-8') then
begin
isutf8:=true;
LEncoding := CharsetToEncoding('utf-8');
end
else
begin
isutf8:=False;
LEncoding := CharsetToEncoding('gbk');
end;
end;
FreeAndNil(per);
end;
LResponse.Position := 0;
Result := ReadStringFromStream(LResponse, -1, LEncoding);
finally
FreeAndNil(LResponse);
end;
end;

私はあなたをだましたことを認めて、上のコードの中で、私はCharSetに正しい値を探していないため、IdGlobal、IdGlobalProtocolsの中の2つの関数を使って、直接理想的な内容を返して、あなたが見たように、まずhttp:IDHTTPとisutf 8:booleanが必要で、それからstr:=GetMethod(xxx)を直接呼び出して内容を得ることができます.
このような方法により、80%のウェブページの符号化問題を解決することができるが、なぜ100%ではないのか、一部のウェブページがidhttpを通過しているからである.get、あなたはResponseを発見します.CharSet=',HTMLにはエンコードされたmetaタグが設定されていませんが,この場合は,もつれずに省略してください...
注:本文は菜鳥にしか向いていないので、達人がレンガを撮ることも歓迎します.