`

xmlhttp 乱码 的解决方法 (UTF8,GB2312 编码 解码)(转)

阅读更多
用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>


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

相关推荐

    xmlhttp 乱码 比较完整的解决方法 (UTF8,GB2312 编码 解码)

    .XMLHTTP 乱码解决方法 (UTF8,GB2312 编码解码) 在使用 XMLHTTP 发送表单数据时,容易出现中文乱码的问题,主要是由于 Post 表单数据时中文乱码和服务器 Response 被 XMLHTTP 不正确编码引起的乱码。解决这个问题...

    XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)

    本文将深入探讨如何解决XMLHTTP请求过程中可能出现的UTF8和GB2312编码导致的乱码问题,以及如何解决DHTMLX组件无法正确显示中文的问题。 1. **发送方的中文编码转换** 当需要通过XMLHTTP发送包含中文字符的数据时...

    GB和UTF网页源码采集器解决乱码

    本文将深入探讨如何解决GB2312和UTF-8编码导致的乱码问题,以及如何利用VB编程语言和XMLHTTP组件来实现高效、准确的网页源码读取。 首先,我们要理解GB2312和UTF-8编码的区别。GB2312是中国大陆早期广泛使用的简体...

    php_xmlhttp 乱码问题解决方法

    综上所述,要解决PHP与XMLHTTP通信时的乱码问题,需要关注整个数据处理流程中的编码和解码问题,从前端的字符集声明,到服务端的编码转换处理,再到客户端对返回数据的正确解析,每一个环节都不能忽视。

    关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法

    本问题涉及的是一个具体的情景,即UTF-8编码的客户端通过AJAX方式从GB2312编码的服务器端获取数据时遇到的乱码问题。UTF-8是一种广泛采用的Unicode字符编码标准,而GB2312是中国大陆早期的简体中文编码标准,这两种...

    vbs中将GB2312转Unicode的代码

    在VBScript(VBS)编程中,处理不同字符编码是一个常见的挑战。本文主要关注如何将GB2312编码...在VBScript中,无论是使用ADO还是自定义函数,都能帮助我们处理GB2312这样的非UTF-8编码,确保数据正确地被解析和显示。

    ajax到servlet乱码解决

    通过使用 `encodeURI()` 函数在 AJAX 客户端编码 URL 参数和使用 `URLDecoder` 类在 Servlet 服务器端解码 URL 参数,我们可以解决 AJAX 到 Servlet 乱码问题。这样,我们的应用程序可以正确地处理中文参数,从而...

    Ajax传参是乱码解决方案

    ### Ajax传参是乱码解决方案 在Web开发过程中,数据编码问题经常会导致各种各样的乱码现象...通常情况下,统一使用UTF-8编码是最简单有效的解决方案。希望本文能够帮助大家更好地理解和处理Web开发中的字符编码问题。

    编码为GB2312网站让AJAX接收的数据显示支持中文

    然而,默认情况下,AJAX请求通常使用UTF-8编码,这可能导致在处理非UTF-8(如GB2312)编码的数据时出现乱码。 描述中提供的代码片段展示了如何解决这个问题。首先,代码创建了一个XMLHttpRequest对象,这是AJAX的...

    支付宝asp集成_utf-8

    本文将详细阐述“支付宝asp集成_utf-8”这一主题,包括如何实现UTF-8编码下的支付宝接口集成,以及解决可能出现的乱码问题。 首先,我们要了解UTF-8编码的重要性。UTF-8是一种广泛使用的Unicode字符编码,能够表示...

    Ajax 乱码

    如果文件实际编码为其他编码(如UTF-8),而设置的`charset`为`gb2312`,则仍然会出现乱码。因此,正确的做法是先确定文件的实际编码方式,再相应地设置`charset`值。 ##### 案例二:Ajax请求中的乱码问题 当使用...

    PHP Ajax中文乱码问题解决方法

    是因为XMLHttp在处理返回的responstText的时候把responstBody按UTF-8编码进行解码的,如果服务器端送出的数据流的确是UTF-8编码,那么中文字就会正确显示,但如果是GBK或是其他编码则会出现上述情况。 解决的办法是...

    ajax+php中文乱码解决办法

    当用户在表单中输入中文内容,通过AJAX发送到服务器时,服务器会将接收到的UTF-8编码的中文内容转换成GB2312,然后再返回给客户端,从而避免乱码。 总结来说,处理AJAX与PHP之间的中文乱码问题,关键在于确保数据的...

    AJAX中文乱码PHP中完美解决方法

    如果服务器端的页面编码不是UTF-8,比如使用的是GB2312或其他编码,那么在服务器端接收到这些参数时,如果不进行适当的转换,就可能导致乱码。解决这个问题的方法是在服务器端进行编码转换。在PHP中,可以使用`iconv...

    AJAX技术使用XMLHttpRequest对象传递参数的中文乱码问题

    一种常见的解决方法是使用JavaScript内置函数`encodeURI`对发送的数据进行编码,并在服务器端使用相应的解码函数来还原原始数据。具体步骤如下: 1. **客户端编码**: ```javascript // 使用POST方式发送请求 ...

    ajax提交到servelt获取参数有乱码的解决方法

    2. GET方法时,根据实际的请求参数编码(如GBK或GB2312),使用`new String(bytes, "编码")`进行解码。 3. POST方法时,使用`new String(bytes, "UTF-8")`将请求参数从ISO-8859-1转换为UTF-8。 通过这些步骤,我们...

Global site tag (gtag.js) - Google Analytics