html页面发送post请求中文乱码,用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案...
用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解决方案...相关推荐
- JS(HTTP页面)发送HTTPS请求、同源策略
今天遇到一个必须在前端HTTP页面发送HTTPS请求的功能,有点小尴尬,这个跨域问题,也没啥好的解决方式,我网上查了一下,也没啥好的方式! 后来总结了一下,有两种方式: 1.a标签 <a hre ...
- python写页面发送post请求_Python模拟浏览器向CSDN发送post请求的方法,POST
目录 1.发送get请求的方法 import requests import json def GET(url): #get请求 req = requests.get(url) #输出状态码 prin ...
- mysql报错乱码_连接mysql服务器报错时,出现乱码
页头用了 header('content-type:text/html;charset=utf-8'); try { $this->dbo=new PDO($dsn,$dbuser,$dbpas ...
- 连接mysql报错有乱码_连接mysql服务器报错时,出现乱码
页头用了 header('content-type:text/html;charset=utf-8'); try { $this->dbo=new PDO($dsn,$dbuser,$dbpas ...
- java文件用editplus乱码,EditPlus设置编码后,编译时仍然出现乱码
之前用EditPlus学习JavaSE的内容,为了统一编码,按网上教程将该IDE当做编辑器编辑Java程序,将EditPlus的编码设置为UTF-8,教程步骤如下: 在工具(Tools)--配置(用户 ...
- java http 中文乱码_关于java发送http请求时中文乱码的一种解决办法
在jsp中常见的乱码解决办法无外乎是关于get和post两种方式的,但只有切实地在实践中使用时才会注意或者说注重到其他方式.例如,在http请求头中传送中文参数,出现乱码,如何解决? 实际场景:使用S ...
- java post 注册_利用JAVA发送POST请求(垃圾注册就是这么产生的) | 学步园
大伙都知道利用JAVA的net包的URL类和 URLConnection可以得到网页源代码(这个应该是蜘蛛程序的锥形吧),但是向网页发送数据怎么办呢,GET请求很好处理,直接在网址后面加参数就可以了, ...
- ASP.NET2.0_执行页面发送的强类型方法与弱类型方法
强类型方法. 1,先在源页面代码块中,声明一个公共属性; 2,再在宿页面呈现块中,添加一个<% PreviousPageType %>指令,在其中指定VirtualPath属性 3,最后在 ...
- 006_Ajax发送POST请求
1. 使用我们的Ajax动态WEB项目 2. 编写ajax_post.html <!DOCTYPE html> <html><head><meta chars ...
- java在线支付---06,07,08_在线支付_编写将数据提交给易宝支付的JSP页面,集成和测试向易宝发送支付请求,实现浏览器自动向易宝发送支付请求
06_在线支付_编写将数据提交给易宝支付的JSP页面 -------------------------------------------------------------- 1./payment ...
最新文章
- Windows 蠕虫首次现身 Mac 电脑:伪装成 Adobe Flash 软件
- 【转】对ASP.NET程序员非常有用的85个工具
- Joint Consensus两阶段成员变更的单步实现
- Gensee SDK UserInfo类函数详细说明
- IE6.0中getElementsByName和getElementById的bug
- 线性代数矩阵秩的8大性质、重要定理以及关系
- 矩阵分析之 实矩阵分解(3)Cholesky分解
- GoAhead的asp过程与goform过程浅析
- 小米运动蓝牙耳机使用说明书-如果第二次切换到配对状态
- 计算机职称英浯单词背记 app,8款经典背单词软件 帮你轻松过英语6级
- 这次,在人工智能面前,人类输得一败涂地
- python Beautiful Soup常用过滤方法
- mysql增删改查语句大全
- 微信支付服务商模式——前期准备
- 基于FPGA音乐播放器硬件电路设计
- 解决HTTPS证书安全检测时提示 PCI DSS 不合规问题
- 科讯CMS V9.0标签大全
- 利尔达入驻中国联通5G物联网OpenLab,开启合作新篇章
- 博客园添加单曲背景音乐
- 数字化交付模式下三维数字化工厂建设
热门文章
- python自动化运维平台下载_5、python自动化运维——集中化管理平台Ansible
- 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
- ElementUI:el-container实现高度占满
- CSS:实现跳动小球蒙版效果
- 工作心得_在做算法工程师的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?
- 单目相机与激光标定相关文章与代码(草稿)
- 算法笔记_面试题_4.树的遍历(前序/中序/后续遍历)
- Datatable转实体 实体转换辅助类
- [Beta阶段]第十次Scrum Meeting
- XML揭秘 入门 应用 精通pdf