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