關于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> 在上面代碼中醒目的部分,charset=utf-8,我們要的就是這個,這部分是英文,所以不管什么編碼,都能正常得到這部分內容,需要做的就是用正則把charset=后面的內容取出,再判斷具體的編碼,一般只需要考慮兩種情況:utf-8和gbk,實現(xiàn)代碼如下: function Txxxxxx.getMethod(AURL: string): string; 我承認,我欺騙了你,因為在上面的代碼中,我沒有給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標簽,如果這種情況,請不要糾結,略過它吧。。。。 注明:本文只適合菜鳥閱讀,也歡迎高手拍磚。 |
|