>웹 프론트엔드 >JS 튜토리얼 >GB2312 서버측 잘못된 code_javascript 기술을 얻기 위해 AJAX를 사용하는 UTF-8 클라이언트 문제에 대한 해결 방법

GB2312 서버측 잘못된 code_javascript 기술을 얻기 위해 AJAX를 사용하는 UTF-8 클라이언트 문제에 대한 해결 방법

WBOY
WBOY원래의
2016-05-16 18:14:561297검색

클라이언트는 현재 모든 사람이 인식하는 표준 인코딩인 UTF-8로 인코딩됩니다.
이 경우 AJAX를 사용하여 GB2312로 인코딩된 서버 측 정보를 비동기적으로 얻을 때 필연적으로 한자가 왜곡되는 문제에 직면하게 됩니다. 🎜> 대상 데이터는 GB2312이지만 XMLHttpRequest는 기본적으로 데이터 캡슐화에 UTF-8을 사용하므로 왜곡된 문자가 생성되기 때문입니다.
많은 사람들이 경량 JS 도구인 set-prototype.js와 AJAX 기능을 사용하고 있다고 생각합니다. 도 매우 훌륭합니다
사용하고 있어서 프로토타입.js를 기반으로 이 문제를 고려하고 있습니다
그러나 많은 실험 후에도 반환되는 responseText를 올바른 인코딩 형식으로 변환할 수 없습니다
나중에 원본 데이터 정보가 XMLHttpRequest 객체의 responseBody 속성에 저장된다는 것을 알게 되었습니다
그런데 프로토타입.js의 AJAX 함수에서 반환된 responseBody 속성은 아직 정의되지 않은 상태여서 직접 해야 할 것 같습니다
거의 한 시간 만에 망치질을 한 후 짧고 간결한 AJAX 프레임워크가 탄생했습니다. 하하. 그러나 기능은 여전히 ​​매우 완벽합니다.
다른 경량 AJAX 프레임워크-bingo.js 구현 방법에서 빌린 작성 방법 중 일부
호출 방법 및 참고 사항:

코드 복사 코드는 다음과 같습니다.
myAjaxCall({
url : 'xxxxx .jsp' //대상 페이지 주소
, params: URLEncoding('prm1=parameter 1&prm2=parameter 2') //파라미터 문자열 정보
, method: 'POST' //전송 방법 POST or GET
,callBack: retValue //콜백 함수명
,isBody: true //responseBody를 반환할지 여부, responseText는 기본적으로 반환
//,isXml: false //데이터를 반환할지 여부 XML 형식
//,errorReport: false //오류 전송 시 프롬프트 팝업 여부
//,attachs: {} //콜백 함수에 추가 매개변수 전달 가능
}) ;
function retValue(res,att){
var strRet = bytes2BSTR(res);
alert(strRet)
}

두 가지 함수에 주의하세요. :

, URLEncoding: 매개변수 Encoding
, bytes2BSTR: 반환된 데이터 디코딩

이 두 함수는 인터넷에서 널리 사용되는 두 가지 인코딩 함수를 직접 활용하지만 둘 다 vbs로 작성되었습니다.
위 페이지에는 두 가지 기능도 첨부되어 있습니다.

코드 복사 코드는 다음과 같습니다.
함수 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)
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
다음
URLEncoding = strReturn
함수 종료
함수 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
함수 종료

아래에 첨부해 주세요. 작성된 경량 Ajax 프레임워크 - myAjax.js 소스 코드:

코드 복사 코드는 다음과 같습니다. :

/**
2 * myAjax
3 * by netwild
4 * netwild@163.com
5*/
6 var myAjaxConfig = {
7 "url":""
8 ,"params":""
9 ,"method ":"GET"
,"callBack":function(){}
,"isXml":false
,"isBody":false
,"isCache":false
," errorReport":true
,"statePoll":null
,"postData":null
,"attachs":{}
};
function myAjaxCall(requestJson){
var attachment;
if(requestJson && typeof requestJson == "object"){
if(requestJson.url){myAjaxConfig.url = requestJson.url;}
if(requestJson.params){myAjaxConfig.params = requestJson .params;}
if(requestJson.method){myAjaxConfig.method = requestJson.method;}
if(requestJson.callBack){myAjaxConfig.callBack = requestJson.callBack;}
if(requestJson.isXml ){myAjaxConfig.isXml = requestJson.isXml;}
if(requestJson.isBody){myAjaxConfig.isBody = requestJson.isBody;}
if(requestJson.isCache){myAjaxConfig.isCache = requestJson.isCache;}
if(requestJson.statePoll){myAjaxConfig.statePoll = requestJson.statePoll;}
if(requestJson.attachs){myAjaxConfig.attachs = requestJson.attachs;}
}
if(!myAjaxConfig.isCache ){
var nocache = new Date().getTime();
if(myAjaxConfig.url.indexOf("?")>0){myAjaxConfig.url = "&nocache=" nocache;}
else{myAjaxConfig.url = "?nocache=" nocache;}
}
var newCall = new myAjaxCore();
newCall.init();
}
function myAjaxCore(){
var _self = this;
var _state,_status;
var _httpRequest,_attach;
///////////////////////////////////////////// /////
this.init = function(){
if (window.XMLHttpRequest){
_httpRequest = new XMLHttpRequest();
if (_httpRequest.overrideMimeType) {
_httpRequest.overrideMimeType('text/xml');
}
}else if (window.ActiveXObject) {
var MSXML = ['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.5.0','MSXML2. XMLHTTP.4.0','MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var n=0;ntry {
_httpRequest = new ActiveXObject(MSXML[n]);
휴식;
}catch(e){}
}
}
with(_httpRequest) {
onreadystatechange = _self.getResponse;
open(myAjaxConfig.method,myAjaxConfig.url,true);
if(myAjaxConfig.method == "POST" && (myAjaxConfig.params != "")){
setRequestHeader("Content-Length",myAjaxConfig.params.length);
setRequestHeader("Content-Type","application/x-www-form-urlencoded");
보내기(myAjaxConfig.params);
}else{
var textType = myAjaxConfig.isXml?"text/xml":"text/plain";
_httpRequest.setRequestHeader('Content-Type',textType);
if(browser.IE){
setRequestHeader("Accept-Encoding", "gzip, deflate");
}else if(browser.FF){
setRequestHeader("Connection","close");
}
보내기(null);
}
}
};
///////////////////////////////////////////// /////
this.getResponse = function(){
_state = _httpRequest.readyState;
if(_httpRequest.readyState == 4 && _httpRequest.status){_status = _httpRequest.status;}
if(myAjaxConfig.statePoll){myAjaxConfig.statePoll(_httpRequest.readyState);}
if(_httpRequest .readyState==4 && _httpRequest.status>=400){
_self.abort();
_self.alertf("ERROR:HTTP 응답 코드 " _httpRequest.status);
}
if(_httpRequest.readyState==4 && _httpRequest.status==200){
var response_content;
if(myAjaxConfig.isXML){
response_content = _httpRequest.responseXML;
}else if(myAjaxConfig.isBody){
response_content = _httpRequest.responseBody;
}else{
response_content = _httpRequest.responseText;
}
if(typeof myAjaxConfig.callBack == "function"){
myAjaxConfig.callBack(response_content,myAjaxConfig.attachs);
}else{
eval(myAjaxConfig.callBack "(response_content,myAjaxConfig.attachs)");
}
}
};
///////////////////////////////////////////// /////
this.abort=function(){_httpRequest.abort();};
this.state=function(){return _state;};
this.status=function(){return _status;};
this.destory=function(){_self.abort();delete(_httpRequest);};
this.alertf=function(error){if(myAjaxConfig.errorReport){alert(error);}};
}
if(!browser){
var browser={};
browser.IE = browser.ie = window.navigator.userAgent.indexOf("MSIE")>0;
browser.Firefox = browser.firefox = browser.FF = browser.MF = navigator.userAgent.indexOf("Firefox")>0;
browser.Gecko = browser.gecko = navigator.userAgent.indexOf("Gecko")>0;
browser.Safari = browser.safari=navigator.userAgent.indexOf("Safari")>0;
browser.Camino = browser.camino=navigator.userAgent.indexOf("카미노")>0;
browser.Opera = browser.opera=navigator.userAgent.indexOf("Opera")>0;
browser.other = browser.OT=!(browser.IE || browser.FF || browser.Safari || browser.Camino || browser.Opera);
}
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.