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

原创 2004年07月22日 15:45:00


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

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

Part I Post中文内容

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

如果把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嘛当然就是这个样子了。既然这样,那我们也知道该怎么办了——自己做转换,代码见下:

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 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,看来未必是个好主意。
 
 

get post 区别详解及引发中文乱码问题

1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。  2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连...
  • cl1771066100
  • cl1771066100
  • 2013年12月18日 16:53
  • 1494

关于Get,Post请求中文乱码问题有效解决方法

对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考...
  • wh_forever
  • wh_forever
  • 2015年09月07日 19:00
  • 1638

Get,Post请求中文乱码问题有效解决方法

对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考...
  • rchm8519
  • rchm8519
  • 2014年12月14日 22:57
  • 57647

Struts2中解决POST请求和GET请求中的中文乱码问题

Java语言虽然天生支持国际化语言,但在项目实践中仍然会遇到中文乱码问题。 Struts2提供的默认过滤器虽然可在一定程度上支持编码处理,但过滤器的配置不当或JSP页面编码不当,中文乱码问题仍会出现...
  • oEveryman
  • oEveryman
  • 2013年03月11日 15:26
  • 1612

Get请求,Post请求乱码问题解决方案

之所以出现乱码,主要是由于编码和解码采用的方法不同。 因此保证编码解码格式一致是避免乱码发生的重要前提。 问题背景:JavaWeb技术下,Tomcat作为容器,发送请求的时候出现乱码问题。...
  • u014424628
  • u014424628
  • 2015年09月07日 00:41
  • 8435

get/post请求中文乱码问题

所有的过滤器都只对post请求起作用,在jsp页面中设置字符编码方式,都只是对表单提交请求时的post请求起作用,对get请求不能起到设置其字符编码的作用,在get请求中使用的是默认的编码方法,所以对...
  • wei_chong_chong
  • wei_chong_chong
  • 2016年04月06日 17:38
  • 591

ASP模拟POST提交,然后XMLHTTP获取数据总是乱码,请大家帮忙,感谢!

目前在建的一个项目要求使用外部的一个网站达到切词的目的,由于外部网站的API接口要求必须是POST提交数据,因此只能模拟POST提交,然后再去读取提交后的数据,我用以下的代码,获取回来的中文总是乱码,...
  • lishimin1012
  • lishimin1012
  • 2017年03月06日 22:18
  • 549

过滤器解决get和post方式提交的中文乱码

对于国内的程序员来说,在做项目时避免不了的问题是中文乱码问题。        如果不使用过滤器的话,在每个servlet中都要进行设置编码,如果是post请求还好,但是如果是get请求,就要手动进行...
  • hyn150
  • hyn150
  • 2017年04月19日 21:23
  • 1568

JavaWeb之不同Tomcat版本对get、post请求,中文乱码问题

Myeclipse安装时的前期工作空间的编码准备,就不说了 Tomcat8 Tomcat8 public class dd extends HttpServlet { private stati...
  • u013497151
  • u013497151
  • 2015年05月15日 19:52
  • 1995

Servlet中文乱码原因 解决 Get 和 Post 和客户端

一、Get方式的中文乱码1) 使用如下页面表单内容: 用户名: 密 码:...
  • lxf512666
  • lxf512666
  • 2016年10月26日 23:14
  • 3775
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案
举报原因:
原因补充:

(最多只允许输入30个字)