最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

xmlhttp 亂碼 比較完整的解決方法 (UTF8,GB2312 編碼 解碼)

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:52:35
文檔

xmlhttp 亂碼 比較完整的解決方法 (UTF8,GB2312 編碼 解碼)

xmlhttp 亂碼 比較完整的解決方法 (UTF8,GB2312 編碼 解碼):用XMLHTTP Post Form時(shí)的表單亂碼有兩方面的原因——Post表單數(shù)據(jù)時(shí)中文亂碼;服務(wù)器Response被XMLHTTP不正確編碼引起的亂碼。換句話說,本文主要解決兩個(gè)問題——怎樣正確Post中文內(nèi)容&怎樣正確顯示得到的中文內(nèi)容。 Part I Post中文內(nèi)容 先看
推薦度:
導(dǎo)讀xmlhttp 亂碼 比較完整的解決方法 (UTF8,GB2312 編碼 解碼):用XMLHTTP Post Form時(shí)的表單亂碼有兩方面的原因——Post表單數(shù)據(jù)時(shí)中文亂碼;服務(wù)器Response被XMLHTTP不正確編碼引起的亂碼。換句話說,本文主要解決兩個(gè)問題——怎樣正確Post中文內(nèi)容&怎樣正確顯示得到的中文內(nèi)容。 Part I Post中文內(nèi)容 先看

用XMLHTTP Post Form時(shí)的表單亂碼有兩方面的原因——Post表單數(shù)據(jù)時(shí)中文亂碼;服務(wù)器Response被XMLHTTP不正確編碼引起的亂碼。換句話說,本文主要解決兩個(gè)問題——怎樣正確Post中文內(nèi)容&怎樣正確顯示得到的中文內(nèi)容。

Part I Post中文內(nèi)容

先看看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=中文";

你會(huì)發(fā)現(xiàn)提交上去的東東根本不對(duì),ASP中Request.Form("Text1")根本取不到值。俺用Request.BinaryRead把一個(gè)HTML Form中的Post內(nèi)容寫出來看了看,才發(fā)現(xiàn)問題——Form提交時(shí)也要編碼的,編碼后的中文是類似于%??%??的轉(zhuǎn)義字符,比如“中文”就被編碼為:%D6%D0%CE%C4。呵呵,也怪俺笨,人家CONTENT-TYPE里明明寫的清清楚楚——application/x-www-form-urlencoded,urlencoded嘛當(dāng)然就是這個(gè)樣子了。既然這樣,那我們也知道該怎么辦了——自己做轉(zhuǎn)換,代碼見下:
代碼如下:
<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.正確顯示得到的中文內(nèi)容

OK,如果你在Server端把Form的內(nèi)容寫到數(shù)據(jù)庫(kù)/文件的話,你在那里看到的中文毫無問題,但是,假如你想看看Server的Response——問題來了:如果Response的結(jié)果不是XML,XMLHTTP.responseXML里當(dāng)然是不會(huì)有東東的,那就用responseText好了,在代碼的最后加一句:

alert(oReq.responseText)
看看俺們辛勤勞動(dòng)的結(jié)果  

但是但是.....怎么所有的中文全變成了方格? (我打不出來,有興趣自己去試,也不用Post,Get一個(gè)含有中文的網(wǎng)頁(yè)就可以發(fā)現(xiàn)了。)

原因很簡(jiǎn)單:XMLHTTP得到Response時(shí)假定Response是UTF8編碼的,如果Response是XML,那還可以通過encoding來指定編碼,但HTML就不行了。(見鬼的GB2312,再次打倒?。┧运押珿B2312編碼的HTML當(dāng)成UTF8格式,不出錯(cuò)才有鬼!

不過好在還有補(bǔ)救的辦法:XMLHTTP的responseBody 屬性里包含的可是未解碼的Resonse——"a raw undecoded bytes as received directly from the server" :),唯一的問題是,responseBody返回的是一個(gè)unsigned bytes數(shù)組,我們?cè)趺慈ピL問它,怎么把它轉(zhuǎn)換成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) 
</SSRIPT>

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

xmlhttp 亂碼 比較完整的解決方法 (UTF8,GB2312 編碼 解碼)

xmlhttp 亂碼 比較完整的解決方法 (UTF8,GB2312 編碼 解碼):用XMLHTTP Post Form時(shí)的表單亂碼有兩方面的原因——Post表單數(shù)據(jù)時(shí)中文亂碼;服務(wù)器Response被XMLHTTP不正確編碼引起的亂碼。換句話說,本文主要解決兩個(gè)問題——怎樣正確Post中文內(nèi)容&怎樣正確顯示得到的中文內(nèi)容。 Part I Post中文內(nèi)容 先看
推薦度:
標(biāo)簽: 亂碼 編碼 http
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top