因胸联盟 发表于 2015-1-16 22:34:54

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语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况;

莫相离 发表于 2015-1-19 17:31:12

Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)

变相怪杰 发表于 2015-1-28 09:10:17

我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。

admin 发表于 2015-2-5 20:22:03

ASP也是这几种脚本语言中最简单易学的开发语言。但ASP也是这几种语言中唯一的一个不能很好支持跨平台的语言。  因为ASP脚本语言非常简单,因此其代码也简单易懂,结合HTML代码,可快速地完成网站的应用程序。

飘灵儿 发表于 2015-2-13 12:58:39

运用经典的例子。并且自己可以用他来实现一些简单的系统。如果可以对他进行进一步的修改,找出你觉得可以提高性能的地方,加上自己的设计,那就更上一个层次了,也就会真正地感到有所收获。

小女巫 发表于 2015-3-3 21:28:31

我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标.

再现理想 发表于 2015-3-11 13:55:03

最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。

老尸 发表于 2015-3-18 21:45:06

Response:从字面上讲是“响应”,因此这个是服务端向客户端发送东西的,例如Response.Write

兰色精灵 发表于 2015-3-26 19:20:55

他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。
页: [1]
查看完整版本: ASP教程之用XMLHTTP Post/Get HTML页面时的中文乱...