• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    xmlhttp 乱码 比较完整的解决方法 (UTF8,GB2312 编码 解码)
    用XMLHTTP Post Form时的表单乱码有两方面的原因——Post表单数据时中文乱码;服务器Response被XMLHTTP不正确编码引起的乱码。换句话说,本文主要解决两个问题——怎样正确Post中文内容怎样正确显示得到的中文内容。

    Part I Post中文内容

    先看看E文的表单是怎么提交的:
    复制代码 代码如下:

    SCRIPT language="JavaScript"> 
    strA = "submit1=Submittext1=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=Submittext1=scsdfsd";换成:
    strA = "submit1=Submittext1=中文";

    你会发现提交上去的东东根本不对,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=Submittext1=中文") 
    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)
    看看俺们辛勤劳动的结果  

    但是但是.....怎么所有的中文全变成了方格? (我打不出来,有兴趣自己去试,也不用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=Submittext1=中文") 
    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) 
    /SSRIPT>
    您可能感兴趣的文章:
    • Java在web页面上的编码解码处理及中文URL乱码解决
    • escape编码与unescape解码汉字出现乱码的解决方法
    • PHP base64编码后解码乱码的解决办法
    • XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
    • 浅谈编码,解码,乱码的问题
    上一篇:本人ajax留言板的源程序 不错的应用js
    下一篇:Baidu Musicbox 用到的ajax代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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