轉(zhuǎn)載自:
http://www.superfection.com/blog/?p=43
魔爪的作者Djunny曾經(jīng)說(shuō)過(guò),下載的主要問(wèn)題是要熟悉各個(gè)網(wǎng)絡(luò)的不同特點(diǎn)(比中文確切的英文單詞應(yīng)該是whimsicalness)。這點(diǎn)我現(xiàn)在是深有體會(huì)。比如大部分網(wǎng)站的url是基于utf8的,但是有些卻是基于GB2312的,這些網(wǎng)站wininet可能不能正確處理。
其實(shí)ie是能正確處理的,但是微軟卻沒(méi)有把相應(yīng)的功能放到wininet里面,這目的只有一個(gè),微軟想使得ie的功能比wininet多一點(diǎn),也就是故意要讓程序員麻煩一些。何苦?你讓人家難受,人家自然要找你的漏洞。
為何不放棄wininet而用liburl之類的程序,畢竟后者若干年的開(kāi)發(fā),久經(jīng)考驗(yàn)。原因:做個(gè)簡(jiǎn)單的工具雖然可以用libcurl,但是發(fā)布uread這樣的應(yīng)用就不好,要至少多一個(gè)dll,麻煩。
好,下面談?wù)?#8220;錕斤拷”的問(wèn)題。其實(shí)這個(gè)問(wèn)題已經(jīng)有人談過(guò),參見(jiàn) http://hooopo.javaeye.com/blog/352451. 但是這里是由wininet引起的。采用簡(jiǎn)單的wininet調(diào)用,訪問(wèn):
http://www.sjtxt.com/soft/download.asp?softid=21519&downid=2&id=21525
你會(huì)發(fā)現(xiàn)重定向到一個(gè)網(wǎng)址:
http://down1.sjtxt.com/2010-2/錕斤拷士錕斤拷陸.rar
為什么這里顯示“錕斤拷”,就是wininet沒(méi)有正確地解碼,把這個(gè)網(wǎng)站返回的gb碼當(dāng)成utf8, 先轉(zhuǎn)為utf16,然后又轉(zhuǎn)成utf8,最后按照gb顯示出來(lái)就變成了“錕斤拷”了(實(shí)際的轉(zhuǎn)向地址為http://down1.sjtxt.com/2010-2/斗士大陸.rar,感興趣的可以把這個(gè)“錕斤拷”如何出來(lái)的詳細(xì)推演一下)。
處理這個(gè)問(wèn)題的辦法是不要讓wininet進(jìn)行自動(dòng)重定向(301 302之類),自己進(jìn)行處理。這下更麻煩了,本來(lái)用wininet就是為了省事,沒(méi)想到卻要多寫若干代碼。
還有一個(gè)可笑的事情是,wininet的ansi版本和unicode版本不同,后者自動(dòng)地把url的path部分當(dāng)成utf8處理,而前者不會(huì)。我有些工具是用delphi7寫的,有些是用delphi 2010寫的,對(duì)某些網(wǎng)站,后者則要調(diào)用以下這樣的函數(shù)
InternetSetOption(hSession, 100{INTERNET_OPTION_CODEPAGE_PATH}, @CP_CHINA, sizeof(CP_CHINA));
其中最新的常量,Delphi中還沒(méi)有定義(CP_CHINA = 936)。
這些問(wèn)題的解決,只是把工具做的好一些。實(shí)際上沒(méi)有什么意義,都是微軟沒(méi)有把事情做好。你做好點(diǎn),大家就可以做些有意義的事情是不?