亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用XMLHTTP Post/Get HTML頁面時的中文亂碼之完全Script解決方案

2019-11-18 20:14:59
字體:
來源:轉載
供稿:網友
以前我曾經貼過一篇用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,再次打倒?。┧运押珿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 = (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,看來未必是個好主意。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久九九全国免费精品观看| 日韩美女视频免费在线观看| 青青久久aⅴ北条麻妃| 激情成人在线视频| 国产亚洲视频中文字幕视频| 精品国产91乱高清在线观看| 亚洲最大av网| 在线观看欧美日韩国产| 国产自产女人91一区在线观看| 社区色欧美激情 | 日韩av影视综合网| 欧美高清无遮挡| 亚洲视频在线视频| 91国产视频在线播放| 国模精品视频一区二区| 91精品视频免费观看| 国产成人精品a视频一区www| 亚洲黄色av女优在线观看| 欧美成人午夜激情| 精品视频久久久久久| 日韩亚洲欧美中文在线| 日韩精品中文字幕在线| 国产91精品青草社区| 日本不卡视频在线播放| 亚洲欧美在线免费观看| 91视频-88av| 日韩精品免费一线在线观看| 欧美激情在线播放| 成人两性免费视频| 久久影视电视剧免费网站清宫辞电视| 亚洲天堂男人天堂女人天堂| 亚洲男女性事视频| 国产精品久久久久久婷婷天堂| 91精品视频免费观看| 国产精品一二三视频| 亚洲成人久久久久| 精品久久久久久久久久国产| 国产精品一区二区三区久久| 91久久久久久久一区二区| 国内成人精品视频| 91精品视频免费| 欧美一区二区影院| 国产精品国产自产拍高清av水多| 国产精品日韩电影| 精品久久中文字幕久久av| 国产精品日韩专区| 日韩成人激情影院| 亚洲第一精品久久忘忧草社区| 最新国产精品拍自在线播放| 亚洲欧美国产精品久久久久久久| 狠狠色狠狠色综合日日小说| 亚洲一区二区在线播放| 久久夜精品香蕉| 永久免费精品影视网站| 欧美一级黑人aaaaaaa做受| 97精品免费视频| 17婷婷久久www| 26uuu另类亚洲欧美日本老年| 91黑丝在线观看| 亚洲影院色在线观看免费| 亚洲女人天堂视频| 亚洲国产精品99久久| 国产91ⅴ在线精品免费观看| 久久久久久久一| 2019亚洲日韩新视频| 精品久久久久久中文字幕大豆网| 亚洲精品美女免费| 亚洲乱亚洲乱妇无码| 日韩美女视频在线观看| 免费成人高清视频| 大伊人狠狠躁夜夜躁av一区| 91香蕉嫩草神马影院在线观看| 国产99久久久欧美黑人| 色午夜这里只有精品| 日韩福利伦理影院免费| 日韩最新在线视频| 欧美片一区二区三区| www.99久久热国产日韩欧美.com| 国产91在线播放| 久久久久久久国产| 69国产精品成人在线播放| 日韩精品高清在线| 国产日产亚洲精品| 日韩精品久久久久久久玫瑰园| 成人欧美一区二区三区在线| 亚洲精品suv精品一区二区| 亚洲精品中文字| 欧美理论在线观看| 激情懂色av一区av二区av| 爽爽爽爽爽爽爽成人免费观看| 亚洲一区二区中文字幕| 91性高湖久久久久久久久_久久99| 亚洲成人av片| 亚洲国产成人精品一区二区| 亚洲免费中文字幕| 韩国三级日本三级少妇99| 不卡伊人av在线播放| 欧美激情区在线播放| 色偷偷av一区二区三区乱| 久久成人综合视频| 午夜精品福利电影| 91麻豆国产语对白在线观看| 亚洲女人初尝黑人巨大| 超在线视频97| 欧美日韩高清区| 深夜成人在线观看| 国产成人在线播放| 亚洲第一视频在线观看| 亚洲欧美中文在线视频| 国产一区二中文字幕在线看| 亚洲区免费影片| 亚洲美女在线视频| 国产精品一二三在线| 伊人伊成久久人综合网小说| 色偷偷9999www| 成人免费网站在线| 亚洲国产成人在线视频| 91免费人成网站在线观看18| 精品久久国产精品| 亚洲精品国产精品国自产观看浪潮| 久久久国产一区| 国产精品精品一区二区三区午夜版| 国产日韩在线看| 日韩欧美在线播放| 日韩在线观看免费网站| 日韩美女在线观看一区| 欧美成人国产va精品日本一级| 亚洲a在线播放| 久久久伊人欧美| 亚洲片av在线| 国产视频观看一区| 欧美专区日韩视频| 九九精品视频在线观看| 国产97在线视频| 久久精品亚洲一区| 亚洲男人天堂古典| 久久久亚洲天堂| 韩国精品美女www爽爽爽视频| 国产不卡av在线免费观看| xxxx欧美18另类的高清| 久久久久久亚洲| 国产91久久婷婷一区二区| 色久欧美在线视频观看| 综合av色偷偷网| 亚洲天堂免费在线| 亚洲欧美日韩天堂一区二区| 亚洲japanese制服美女| 国产成人在线一区二区| 国产精品一区二区三区久久| 久久久精品美女| 久久免费高清视频| 91精品免费看| 亚洲精品福利视频| 国产精品偷伦一区二区| 精品视频在线播放| 97免费视频在线播放| 成人亚洲激情网| 91地址最新发布| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧洲一区二区三区在线观看| 亚洲欧美激情在线视频| 日韩高清中文字幕| 欧美性猛交xxxx乱大交蜜桃| 精品久久香蕉国产线看观看亚洲|