GB2312サーバーサイドのコード化け_javascriptスキルを取得するためのAJAXを使用したUTF-8クライアントの解決方法について

WBOY
リリース: 2016-05-16 18:14:56
オリジナル
1258 人が閲覧しました

クライアントは UTF-8 でエンコードされており、これは現在誰もが認識している標準エンコードでもあります
この場合、AJAX を使用して GB2312 でエンコードされたサーバー側情報を非同期的に取得すると、必然的に中国語の文字化けの問題が発生します
なぜなら、対象のデータはGB2312ですが、XMLHttpRequestはデフォルトでデータのカプセル化にUTF-8を使用するため、文字化けが発生します。
軽量JSツールset-prototype.jsとそのAJAX機能を使用している人は多いと思いますこれも非常に優れています
私はそれを使用しているので、prototype.jsに基づいてこの問題を検討してきました
しかし、多くの実験を行った後も、返されるresponseTextを正しいエンコード形式に変換できません
後でXMLHttpRequestオブジェクトのresponseBody属性に元のデータ情報が保存されることを知りました
でもprototype.jsのAJAX関数が返すresponseBody属性は未定義のようです
>ほぼ 1 時間後 ハンマー作業の後、短く簡潔な AJAX フレームワークが誕生しました (笑)、しかし機能はまだ非常に完成度が高いです
一部の記述メソッドは別の軽量 AJAX フレームワーク bingo.js 実装メソッドから借用しました
メソッドの呼び出しと注:

コードをコピー コードは次のとおりです。

myAjaxCall({
url : 'xxxxx .jsp' //対象ページアドレス
, params: URLEncoding('prm1=parameter 1&prm2=parameter 2') //パラメータ文字列情報
, method: 'POST' //送信メソッドPOST または GET
,callBack: retValue //コールバック関数名
,isBody: true //responseBody を返すかどうか、デフォルトでは responseText が返されます
//,isXml: false //データを返すかどうかXML 形式
//,errorReport: false //エラー送信時にプロンプ​​トをポップアップ表示するかどうか
//,attachs: {} //追加のパラメータをコールバック関数に渡すことができます
}) ;
function retValue(res,att){
var strRet = bytes2BSTR(res);
alert(strRet);

2 つの関数に注意してください:

、URLEncoding: パラメータ用 Encoding
、bytes2BSTR: 返されたデータのデコード

これら 2 つの関数は、インターネット上で一般的な 2 つのエンコード関数を直接利用していますが、どちらも vbs で書かれています。
上記のページには 2 つの関数も追加されています:

コードをコピーします コードは次のとおりです:
関数 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
innerCode = innerCode &H10000
End If
Hight8 = (innerCode And &HFF00) &HFF
Low8 = innerCode And &HFF
strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8)
End If
次へ
URLEncoding = strReturn
関数終了
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

以下に添付してください 書かれた軽量 Ajax フレームワーク - myAjax.js ソースコード:

コードをコピー コードは次のとおりです:

/**
2 * myAjax
3 * 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){
varattach;
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");
send(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("接続","閉じる");
}
send(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("エラー: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 == "関数"){
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 = ブラウザ.firefox = ブラウザ.FF = ブラウザ.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("Camino")>0;
browser.Opera = browser.opera=navigator.userAgent.indexOf("Opera")>0;
browser.other = browser.OT=!(browser.IE || ブラウザ.FF || ブラウザ.Safari || ブラウザ.Camino || ブラウザ.Opera);
}
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート