ASP教程之用XMLHTTP Post/Get HTML页面时的中文乱...
使用cdonts,可以发送、查看邮件,实现webmail的功能。结合wsh,可以实现对nt主机的管理,如nt用户管理、iis虚拟主机设置、exchange邮箱设置等等,就像管理本地机一样方便。之前我已经贴过一篇用XMLHTTPPostForm的帖子,那边的代码中我PostE文的Value毫无成绩,可是厥后发明Post含有中文的表单时会呈现乱码,缘故原由固然是UTF-8和GB2312之间的转换成绩了!TNND,打垮GB2312!人人都用UTF8多好。用XMLHTTPPostForm时的表单乱码有两方面的缘故原由――Post表双数据时中文乱码;服务器Response被XMLHTTP不准确编码引发的乱码。换句话说,本文次要办理两个成绩――如何准确Post中文内容&如何准确显现失掉的中文内容。
PartIPost中文内容
先看看E文的表单是怎样提交的:
<SCRIPTlanguage="JavaScript">
strA="submit1=Submit&text1=scsdfsd";
varoReq=newActiveXObject("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);
</ScRIPT>
假如把strA="submit1=Submit&text1=scsdfsd";换成:
strA="submit1=Submit&text1=中文";
你会发明提交上往的东东基本不合错误,ASP中Request.Form("Text1")基本取不到值。俺用Request.BinaryRead把一个HTMLForm中的Post内容写出来看了看,才发明成绩――Form提交时也要编码的,编码后的中文是相似于%??%??的本义字符,好比“中文”就被编码为:%D6%D0%CE%C4。呵呵,也怪俺笨,人家CONTENT-TYPE里明显写的清分明楚――application/x-www-form-urlencoded,urlencoded嘛固然就是这个模样了。既然如许,那我们也晓得该怎样办了――本人做转换,代码见下:
<SCRIPTlanguage="VBScript">
FunctionURLEncoding(vstrIn)
strReturn=""
Fori=1ToLen(vstrIn)
ThisChr=Mid(vStrIn,i,1)
IfAbs(Asc(ThisChr))<&HFFThen
strReturn=strReturn&ThisChr
Else
innerCode=Asc(ThisChr)
IfinnerCode<0Then
innerCode=innerCode+&H10000
EndIf
Hight8=(innerCodeAnd&HFF00)&HFF
Low8=innerCodeAnd&HFF
strReturn=strReturn&"%"&Hex(Hight8)&"%"&Hex(Low8)
EndIf
Next
URLEncoding=strReturn
EndFunction
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.sendstrA
</ScRIPT>
(在这里俺把后面的JavaScript的代码改成了VBScript,不是吃饱了撑的没事干,缘故原由见后)
PartII.准确显现失掉的中文内容
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――"arawundecodedbytesasreceiveddirectlyfromtheserver":),独一的成绩是,responseBody前往的是一个unsignedbytes数组,我们怎样往会见它,怎样把它转换成BSTR?
这就是为何我在下面把代码改成VBScript的缘故原由――VBScriptCandoit,butJavaScriptCannot!
代码见下:
<SCRIPTlanguage="VBScript">
FunctionURLEncoding(vstrIn)
strReturn=""
Fori=1ToLen(vstrIn)
ThisChr=Mid(vStrIn,i,1)
IfAbs(Asc(ThisChr))<&HFFThen
strReturn=strReturn&ThisChr
Else
innerCode=Asc(ThisChr)
IfinnerCode<0Then
innerCode=innerCode+&H10000
EndIf
Hight8=(innerCodeAnd&HFF00)&HFF
Low8=innerCodeAnd&HFF
strReturn=strReturn&"%"&Hex(Hight8)&"%"&Hex(Low8)
EndIf
Next
URLEncoding=strReturn
EndFunction
Functionbytes2BSTR(vIn)
strReturn=""
Fori=1ToLenB(vIn)
ThisCharCode=AscB(MidB(vIn,i,1))
IfThisCharCode<&H80Then
strReturn=strReturn&Chr(ThisCharCode)
Else
NextCharCode=AscB(MidB(vIn,i+1,1))
strReturn=strReturn&Chr(CLng(ThisCharCode)*&H100+CInt(NextCharCode))
i=i+1
EndIf
Next
bytes2BSTR=strReturn
EndFunction
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.sendstrA
alertbytes2BSTR(oReq.responseBody)
</ScRIPT>
嘿嘿,是否是很复杂啊,用这个再碰运气?统统OK!
(特地说说byte(),这个东东在VBScript里的体现只能用妖来描述――对它挪用VarType前往8209――vbArray+vbByte,用LBound、UBound能拿到数组的上界下界,可是就是不克不及用name(i)的情势会见,弄得我觉得在Script里基本没法处置这类范例,在bytes2BSTR函数里能够看到我是把它当做String来处置的――LenB/MidB甚么的,发明这点纯属不测――我入手下手往这个函数里传的是XMLHTTP.responseText,想一个Byte一个Byte地看看内里究竟有点甚么,厥后一时性起把responseText改成responseBody,了局就中奖了,哈哈)
最初的空话:
1、以上代码在MSXMLParser3Release+VBScript5.5情况下经由过程。那位兄弟有早一点版本的Script能够帮我碰运气能不克不及成。
2、一向觉得JavaScriptvsVBScript应当是JavaScript略好,以是偶然候想完全丢弃VBScript,ASPServer/Client一切用JavaScript,看来一定是个好主张。
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。 ASP也是这几种脚本语言中最简单易学的开发语言。但ASP也是这几种语言中唯一的一个不能很好支持跨平台的语言。 因为ASP脚本语言非常简单,因此其代码也简单易懂,结合HTML代码,可快速地完成网站的应用程序。 运用经典的例子。并且自己可以用他来实现一些简单的系统。如果可以对他进行进一步的修改,找出你觉得可以提高性能的地方,加上自己的设计,那就更上一个层次了,也就会真正地感到有所收获。 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。 Response:从字面上讲是“响应”,因此这个是服务端向客户端发送东西的,例如Response.Write 他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。
页:
[1]