wininet 和“锟斤拷”

魔爪的作者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)。

这些问题的解决,只是把工具做的好一些。实际上没有什么意义,都是微软没有把事情做好。你做好点,大家就可以做些有意义的事情是不?

时间: 2024-10-27 04:05:29

wininet 和“锟斤拷”的相关文章

锟斤拷 (转)

锟斤拷,经常在搜索引擎和网站上看到的字符.是一种因微软漏洞造成的乱码. Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER 那么U+FFFD的UTF-8编码出来,恰好是 '\xef\xbf\xbd'. 如果这个'\xef\xbf\xbd',重复多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',然后放到GBK/CP936/GB2312/G

一段java代码带你认识锟斤拷

@Test public void testKunJinKao(){ String str="我不是锟斤拷"; try { byte[] buff=null; //让我们先看看几种错误的转换,let's go //1. 正常的GBK字节流,你以为是UTF-8,所以用UTF-8去解码... buff=str.getBytes("GBK");//这里只要不抛异常,数据一定不会被破坏 String str1=new String(buff,"UTF-8"

基于smtp协议的邮件系统(自己写的)

最近几天做好了应用[贱泰迪],其中有个意见反馈,发送邮件, 我知道可以调用系统发送邮件,但这种方法有个弊端,就是您的手机必须安装Mail的客户端, 因此我想不用系统发送邮件这种方式,能不能向任意邮箱发送邮件呢?给我自己丢下了一个命题. 于是我调查,发现SMTP发送email 无需系统支持,无需配置, 经过多次尝试,多次失败,终于完成了此项功能. 先来看应用[贱泰迪]的效果, 填写您的邮箱.密码等,我就能收到您的反馈意见,是不是很方便呢, 更多的效果,您可以下载贱泰迪(http://down.mu

再再谈java乱码:GBK和UTF-8互转尾部乱码问题分析(续)

GBK字节码用UTF-8解码 UTF-8 的编码规则 转码实例 解决问题 jdk 18 测试 jdk 1617 jdk 版本的影响 小结 参考 在<再谈java乱码:GBK和UTF-8互转尾部乱码问题分析>我们分析了,如果从一个UTF-8 的字节序列,经过 new String(b,"GBK") 的操作,"可能"(与总字节数有关)会破坏数据.结果可能是,损失最后一个"字". 反过来呢?可能会很惨,大范围溃散... 同时,可参考:一段j

struts2 jsp 编码转换, 请大家帮忙看下我的理解哪里出错了。

问题描述 ===index.jsp===<%@pagelanguage="java"pageEncoding="gbk"contentType="text/html;charset=gbk"%><html><body>      <formmethod="post"action="codeTest.action">            输入中文:<in

我的Java开发学习之旅------&amp;gt;Java字符编码解析

Java开发中,常常会遇到乱码的问题,一旦遇到这种问题,常常就很扯蛋,每个人都不愿意承认是自己的代码有问题.其实编码问题并没有那么神秘,那么不可捉摸,搞清Java的编码本质过程就真相大白了.               其实,编码问题存在两个方面:JVM之内和JVM之外.   1.Java文件编译后形成class 这里Java文件的编码可能有多种多样,但Java编译器会自动将这些编码按照Java文件的编码格式正确读取后产生class文件,这里的class文件编码是Unicode编码(具体说是UT

eclipse开发Hbase的一个小程序,但是出现下面一些问题,请求大神赐教

问题描述 eclipse开发Hbase的一个小程序,但是出现下面一些问题,请求大神赐教 代码: import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import

图片-在线等急...请问腾讯思品我的影院效果如何做的

问题描述 在线等急...请问腾讯思品我的影院效果如何做的 曾考虑过用viewpage或者RecyclerView做.但是没有思路或者是做过的麻烦大大们告我.. 我的影院 解决方案 这个就是美工切图做出来的,没有什么特别的. 解决方案二: 用3d相册 MainActivity: package com.android.CustomGallery; /** 一个实现了3D效果的Gallery,就像iPhone中的相册浏览一样炫-- */ import android.app.Activity; im

jax没有反应-Ajax点击按钮,没有反应

问题描述 Ajax点击按钮,没有反应 test.jsp <%@ page contentType="text/html;charset=GB2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> AJAX提交请求测试页面