一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

idhttp 編碼 啊,編碼!最終解決方案,不要再糾結!

 quasiceo 2013-12-23

  關于idhttp取網(wǎng)頁源碼編碼問題,在這里記錄最后一次的解決方法,不想再糾結下去,再也傷不起了。(本文內容均在d2010,indy10.55的環(huán)境下產生及結束)。

  網(wǎng)上只要搜索關于idhttp取網(wǎng)頁亂碼,idyttp編碼問題的文章有一大堆,試了無數(shù),都不滿意,最后再這里記錄一下個人解決方法。

  在IDE中寫如下代碼,str:=http.get(xxxxx);然后Ctrl跟蹤get,會在源碼中得到如下一行,也是最關鍵的一行:

Result := ReadStringAsCharset(LResponse, Response.CharSet);

很明顯,idhttp想給我們做點好事,直接返回解碼后(能正常閱讀、沒有亂碼)的內容,問題來了,當Response.CharSet有值時,返回的內容是完全正確的,當Response.CharSet沒有值時,返回的結果值得商榷了。所以就有了網(wǎng)上常有人問的“為什么在UTF-8的情況下,返回內容是正常的,但是GBK的就不行了?”,經我測試,當網(wǎng)頁是UTF-8時,Response.CharSet='utf-8',當網(wǎng)頁是GBK時,Response.CharSet就不一定是GBK,很多時候都是空的,這時候,在使用上面的函數(shù)時,CharSet默認為西歐(可能吧)編碼,得到的內容比UTF-8編碼后的結果更難看懂。所以,我們要做的,就是給CharSet一個可用的、正確的值。

  如果得到一個可用的、正確的CharSet值呢?首先,idhttp.Response.CharSet這個是首選的,如果這個值為空呢,就需要在返回的HTML中找了,如:

<html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>執(zhí)行 Application.Terminate 后, OnDestroy 中的代碼還會執(zhí)行 - 萬一 - 博客園</title>
<link type="text/css" rel="stylesheet" href="http://www.cnblogs.com/css/common.css"/>

在上面代碼中醒目的部分,charset=utf-8,我們要的就是這個,這部分是英文,所以不管什么編碼,都能正常得到這部分內容,需要做的就是用正則把charset=后面的內容取出,再判斷具體的編碼,一般只需要考慮兩種情況:utf-8和gbk,實現(xiàn)代碼如下:

復制代碼
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中的兩個函數(shù),直接返回一個理想的內容,就像你看到的,首先,需要一個http:IDHTTP和isutf8:boolean,然后直接調用 str:=GetMethod(xxxxxx)就可以得到內容了。

  通過如上方法,能解決80%的網(wǎng)頁編碼問題,為什么不是100%呢,因為還有一部分的網(wǎng)頁,通過idhttp.get,你會發(fā)現(xiàn)Response.CharSet='',并且在HTML中沒有設置編碼的meta標簽,如果這種情況,請不要糾結,略過它吧。。。。

  注明:本文只適合菜鳥閱讀,也歡迎高手拍磚。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    伊人久久五月天综合网| 欧美日韩高清不卡在线播放| 日本欧美一区二区三区高清| 日韩精品人妻少妇一区二区| 久热久热精品视频在线观看| 日本不卡一本二本三区| 神马午夜福利免费视频| 91后入中出内射在线| 国产成人精品视频一二区| 高中女厕偷拍一区二区三区| 国产激情国产精品久久源| 国产精品午夜视频免费观看| 91人妻久久精品一区二区三区| 国产欧美精品对白性色| 国产一区二区三区丝袜不卡| 日本深夜福利在线播放| 欧美日韩乱码一区二区三区| 最新国产欧美精品91| 日本一本不卡免费视频| 国产av一区二区三区久久不卡| 国产一区二区精品高清免费| 精品老司机视频在线观看| 国产精品香蕉在线的人| 国产一级不卡视频在线观看| 欧美国产亚洲一区二区三区| 国产精品一区二区三区黄色片| 国产成人精品国产成人亚洲| 厕所偷拍一区二区三区视频| 久久久免费精品人妻一区二区三区| 欧美人禽色视频免费看| 国产视频一区二区三区四区| 日韩在线中文字幕不卡| 国产亚洲精品一二三区| 欧美精品二区中文乱码字幕高清| 老司机激情五月天在线不卡| 99精品国产一区二区青青| 欧美午夜不卡在线观看| 国产午夜精品美女露脸视频| 日韩欧美国产三级在线观看| 精品国产亚洲av久一区二区三区 | 麻豆欧美精品国产综合久久|