用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案

关键词:VBScript, ASP, JavaScript, Java, XML

以前我曾经贴过一篇用XMLHTTP Post Form 的帖子,那里的代码中我Post E文的Value毫无问题,但是后来发现Post含有中文的表单时会出现乱码,原因当然是UTF-8 和GB2312 之间的转换问题了!TNND,打倒GB2312!大家都用UTF8多好。

用XMLHTTP Post Form时的表单乱码有两方面的原因——Post表单数据时中文乱码;服务器Response被XMLHTTP不正确编码引起的乱码。换句话说,本文主要解决两个问题——怎样正确Post中文内容&怎样正确显示得到的中文内容。

Part I Post中文内容

先看看E文的表单是怎么提交的:

strA = "submit1=Submit&text1=scsdfsd";

var oReq = new ActiveXObject("MSXML2.XMLHTTP");

oReq.open("POST","http://ServerName/VDir/TstResult.asp",false);

oReq.setRequestHeader("Content-Length",strA.length);

oReq.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");

oReq.send(strA);

如果把strA = "submit1=Submit&text1=scsdfsd";换成:

strA = "submit1=Submit&text1=中文";

你会发现提交上去的东东根本不对,ASP中Request.Form("Text1")根本取不到值。俺用Request.BinaryRead把一个HTML Form中的Post内容写出来看了看,才发现问题——Form提交时也要编码的,编码后的中文是类似于%??%??的转义字符,比如“中文”就被编码为:%D6%D0%CE%C4。呵呵,也怪俺笨,人家CONTENT-TYPE里明明写的清清楚楚——application/x-www-form-urlencoded,urlencoded嘛当然就是这个样子了。既然这样,那我们也知道该怎么办了——自己做转换,代码见下:

Function URLEncoding(vstrIn)

strReturn = ""

For i = 1 To Len(vstrIn)

ThisChr = Mid(vStrIn,i,1)

If Abs(Asc(ThisChr)) < &HFF Then

strReturn = strReturn & ThisChr

Else

innerCode = Asc(ThisChr)

If innerCode < 0 Then

innerCode = innerCode + &H10000

End If

Hight8 = (innerCode  And &HFF00)\ &HFF

Low8 = innerCode And &HFF

strReturn = strReturn & "%" & Hex(Hight8) &  "%" & Hex(Low8)

End If

Next

URLEncoding = strReturn

End Function

strA = URLEncoding("submit1=Submit&text1=中文")

oReq = CreateObject("MSXML2.XMLHTTP")

oReq.open "POST","http://ServerName/VDir/TstResult.asp",false

oReq.setRequestHeader "Content-Length",Len(strA)

oReq.setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"

oReq.send strA

(在这里俺把前面的JavaScript的代码改成了VBScript,不是吃饱了撑的没事干,原因见后)

Part II.正确显示得到的中文内容

OK,如果你在Server端把Form的内容写到数据库/文件的话,你在那里看到的中文毫无问题,但是,假如你想看看Server的Response——问题来了:如果Response的结果不是XML,XMLHTTP.responseXML里当然是不会有东东的,那就用responseText好了,在代码的最后加一句:

alert(oReq.responseText)

看看俺们辛勤劳动的结果  :P

但是但是.....怎么所有的中文全变成了方格? (我打不出来,有兴趣自己去试,也不用Post,Get一个含有中文的网页就可以发现了。)

原因很简单:XMLHTTP得到Response时假定Response是UTF8编码的,如果Response是XML,那还可以通过encoding来指定编码,但HTML就不行了。(见鬼的GB2312,再次打倒!)所以它把含GB2312编码的HTML当成UTF8格式,不出错才有鬼!

不过好在还有补救的办法:XMLHTTP的responseBody 属性里包含的可是未解码的Resonse——"a raw undecoded bytes as received directly from the server" :),唯一的问题是,responseBody返回的是一个unsigned bytes数组,我们怎么去访问它,怎么把它转换成BSTR?

这就是为什么我在上面把代码改成VBScript的原因——VBScript Can do it,but JavaScript Cannot!

代码见下:

Function URLEncoding(vstrIn)

strReturn = ""

For i = 1 To Len(vstrIn)

ThisChr = Mid(vStrIn,i,1)

If Abs(Asc(ThisChr)) < &HFF Then

strReturn = strReturn & ThisChr

Else

innerCode = Asc(ThisChr)

If innerCode < 0 Then

innerCode = innerCode + &H10000

End If

Hight8 = (innerCode  And &HFF00)\ &HFF

Low8 = innerCode And &HFF

strReturn = strReturn & "%" & Hex(Hight8) &  "%" & Hex(Low8)

End If

Next

URLEncoding = strReturn

End Function

Function bytes2BSTR(vIn)

strReturn = ""

For i = 1 To LenB(vIn)

ThisCharCode = AscB(MidB(vIn,i,1))

If ThisCharCode < &H80 Then

strReturn = strReturn & Chr(ThisCharCode)

Else

NextCharCode = AscB(MidB(vIn,i+1,1))

strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))

i = i + 1

End If

Next

bytes2BSTR = strReturn

End Function

strA = URLEncoding("submit1=Submit&text1=中文")

oReq = CreateObject("MSXML2.XMLHTTP")

oReq.open "POST","http://ServerName/VDir/TstResult.asp",false

oReq.setRequestHeader "Content-Length",Len(strA)

oReq.setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"

oReq.send strA

alert bytes2BSTR(oReq.responseBody)

嘿嘿,是不是很简单啊,用这个再试试看?一切OK!

(顺便说说byte(),这个东东在VBScript里的表现只能用妖来形容——对它调用VarType 返回8209——vbArray + vbByte,用LBound、UBound能拿到数组的上界下界,但是就是不能用name(i)的形式访问,搞得我以为在Script里根本没法处理这种类型,在bytes2BSTR函数里可以看到我是把它当成String来处理的——LenB/MidB什么的,发现这点纯属意外——我开始往这个函数里传的是XMLHTTP.responseText,想一个Byte一个Byte地看看里面到底有点什么,后来一时性起把responseText改成responseBody,结果就中奖了,哈哈)

最后的废话:

1、以上代码在MSXML Parser 3 Release+VBScript 5.5环境下通过。那位兄弟有早一点版本的Script可以帮我试试看能不能成。

2、一直以为JavaScript vs VBScript应该是JavaScript略好,所以有时候想彻底抛弃VBScript,ASP Server/Client统统用JavaScript,看来未必是个好主意。

posted on 2006-10-23 16:23 汪杰 阅读(1408) 评论(0)  编辑 收藏 引用 所属分类: ajax

html页面发送post请求中文乱码,用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案...相关推荐

  1. JS(HTTP页面)发送HTTPS请求、同源策略

    今天遇到一个必须在前端HTTP页面发送HTTPS请求的功能,有点小尴尬,这个跨域问题,也没啥好的解决方式,我网上查了一下,也没啥好的方式! 后来总结了一下,有两种方式: 1.a标签 <a hre ...

  2. python写页面发送post请求_Python模拟浏览器向CSDN发送post请求的方法,POST

    目录 1.发送get请求的方法 import requests import json def GET(url): #get请求 req = requests.get(url) #输出状态码 prin ...

  3. mysql报错乱码_连接mysql服务器报错时,出现乱码

    页头用了 header('content-type:text/html;charset=utf-8'); try { $this->dbo=new PDO($dsn,$dbuser,$dbpas ...

  4. 连接mysql报错有乱码_连接mysql服务器报错时,出现乱码

    页头用了 header('content-type:text/html;charset=utf-8'); try { $this->dbo=new PDO($dsn,$dbuser,$dbpas ...

  5. java文件用editplus乱码,EditPlus设置编码后,编译时仍然出现乱码

    之前用EditPlus学习JavaSE的内容,为了统一编码,按网上教程将该IDE当做编辑器编辑Java程序,将EditPlus的编码设置为UTF-8,教程步骤如下: 在工具(Tools)--配置(用户 ...

  6. java http 中文乱码_关于java发送http请求时中文乱码的一种解决办法

    在jsp中常见的乱码解决办法无外乎是关于get和post两种方式的,但只有切实地在实践中使用时才会注意或者说注重到其他方式.例如,在http请求头中传送中文参数,出现乱码,如何解决? 实际场景:使用S ...

  7. java post 注册_利用JAVA发送POST请求(垃圾注册就是这么产生的) | 学步园

    大伙都知道利用JAVA的net包的URL类和 URLConnection可以得到网页源代码(这个应该是蜘蛛程序的锥形吧),但是向网页发送数据怎么办呢,GET请求很好处理,直接在网址后面加参数就可以了, ...

  8. ASP.NET2.0_执行页面发送的强类型方法与弱类型方法

    强类型方法. 1,先在源页面代码块中,声明一个公共属性; 2,再在宿页面呈现块中,添加一个<% PreviousPageType %>指令,在其中指定VirtualPath属性 3,最后在 ...

  9. 006_Ajax发送POST请求

    1. 使用我们的Ajax动态WEB项目 2. 编写ajax_post.html <!DOCTYPE html> <html><head><meta chars ...

  10. java在线支付---06,07,08_在线支付_编写将数据提交给易宝支付的JSP页面,集成和测试向易宝发送支付请求,实现浏览器自动向易宝发送支付请求

    06_在线支付_编写将数据提交给易宝支付的JSP页面 -------------------------------------------------------------- 1./payment ...

最新文章

  1. Windows 蠕虫首次现身 Mac 电脑:伪装成 Adobe Flash 软件
  2. 【转】对ASP.NET程序员非常有用的85个工具
  3. Joint Consensus两阶段成员变更的单步实现
  4. Gensee SDK UserInfo类函数详细说明
  5. IE6.0中getElementsByName和getElementById的bug
  6. 线性代数矩阵秩的8大性质、重要定理以及关系
  7. 矩阵分析之 实矩阵分解(3)Cholesky分解
  8. GoAhead的asp过程与goform过程浅析
  9. 小米运动蓝牙耳机使用说明书-如果第二次切换到配对状态
  10. 计算机职称英浯单词背记 app,8款经典背单词软件 帮你轻松过英语6级
  11. 这次,在人工智能面前,人类输得一败涂地
  12. python Beautiful Soup常用过滤方法
  13. mysql增删改查语句大全
  14. 微信支付服务商模式——前期准备
  15. 基于FPGA音乐播放器硬件电路设计
  16. 解决HTTPS证书安全检测时提示 PCI DSS 不合规问题
  17. 科讯CMS V9.0标签大全
  18. 利尔达入驻中国联通5G物联网OpenLab,开启合作新篇章
  19. 博客园添加单曲背景音乐
  20. 数字化交付模式下三维数字化工厂建设

热门文章

  1. python自动化运维平台下载_5、python自动化运维——集中化管理平台Ansible
  2. 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
  3. ElementUI:el-container实现高度占满
  4. CSS:实现跳动小球蒙版效果
  5. 工作心得_在做算法工程师的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?
  6. 单目相机与激光标定相关文章与代码(草稿)
  7. 算法笔记_面试题_4.树的遍历(前序/中序/后续遍历)
  8. Datatable转实体 实体转换辅助类
  9. [Beta阶段]第十次Scrum Meeting
  10. XML揭秘 入门 应用 精通pdf