<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      另一篇:用XMLHTTP Post/Get HTML頁面時的中文亂碼問題之完全Script處理方案

      [摘要]用XMLHTTP Post/Get HTML頁面時的中文亂碼問題之完全Script解決方案關鍵詞:VBScript, ASP, JavaScript, Java, XML以前我曾經貼過一篇用XMLH...
      用XMLHTTP Post/Get HTML頁面時的中文亂碼問題之完全Script解決方案

      關鍵詞:VBScript, ASP, JavaScript, Java, XML

      以前我曾經貼過一篇用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 = (innerCodeAnd &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,再次打倒。┧运押珿B2312編碼的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 = (innerCodeAnd &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,看來未必是個好主意。





      日韩精品一区二区三区高清