首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> XML教程
用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案-ASP教程,XML相关
作者:网友供稿 点击:23
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
以前我曾经贴过一篇用xmlhttp post form 的帖子,那里的代码中我post e文的value毫无问题,但是后来发现post含有中文的表单时会出现乱码,原因当然是utf-8 和gb2312 之间的转换问题了!tnnd,打倒gb2312!大家都用utf8多好。

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

part i post中文内容

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

<script language="javascript">
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);
</script>

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

<script language="vbscript">
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
</script>

(在这里俺把前面的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!

代码见下:
<script language="vbscript">
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)
</script>

嘿嘿,是不是很简单啊,用这个再试试看?一切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,看来未必是个好主意。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用c#如何读取xml文件-.NET教程,XML应用
·利用XMLHTTP无刷新添加数据之Post篇.-ASP教程,XML相关
·VB下如何编写CRC校验程序-.NET教程,VB.Net语言
·Java编程中更新XML文档的常用方法-JSP教程,Java与XML
·JavaScript中获得地址栏参数QueryString-JSP教程,Java技巧及代码
·ASP.NET 2.0中将 GridView 导出到 Excel 文件中-.NET教程,数据库应用
·在red hat linux 10下安装 eclipse 3-JSP教程,Java技巧及代码
·WinCE 5.0边做边学(3)-.NET教程,评论及其它
·用Fireworks制作Logo心得体会-网页设计,Fireworks
·Cookies,SSL,httpclient的多线程处理,HTTP方法-PHP教程,PHP应用
最新文章
·google adsense 2007巡讲大会郑州站总结_网赚技巧
·起点小说网推出小说内容联盟_网赚技巧
·oblog站长访谈系列②:vv博客林林_站长访谈
·学习dreamweaver8了解掌握css层叠样式表_dreamweaver教程
·搞行业网站必须走出去!_站长心得
·网页设计的艺术处理原则_站长心得
·建站常识:如何使用ftp连接虚拟主机?_站长心得
·google rank_google推广
·如何在搜寻结果名中名列前茅_google推广
·几个知名英文搜索引擎的优劣比较_seo网站优化
相关主题
  • 用xmlhttp和java session监听改善站内消息系统_javascript教程
  • 用XMLHTTP做一个自己特色的Google-ASP教程,ASP应用
  • 用XMLHTTP很好的一个例子-ASP教程,XML相关
  • 用XMLHTTPRequest对象进行客户端验证-ASP教程,XML相关
  • 用xmlhttp做一个自己特色的google
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭