首页澳门新葡亰官方网站 › 关于UTF-8的客户端用AJAX情势赢得GB2312的劳务器端乱码难点的化解办法_javascript手艺_脚本之家

关于UTF-8的客户端用AJAX情势赢得GB2312的劳务器端乱码难点的化解办法_javascript手艺_脚本之家

附加功能

客户端是UTF-8编码,这也是现在大家公认的标准编码
在这种情况下,实用AJAX异步获取GB2312编码的服务器端信息时,不可避免的要遇到汉字乱码问题
因为目标数据是GB2312,但XMLHttpRequest默认是用UTF-8来进行数据封装的,因此会产生乱码
相信很多人都在用轻量级的JS工具集-prototype.js,它的AJAX功能同样很出色
我也一直在用它,因此对于这个问题也一直是基于 prototype.js来考虑的
但经过多次试验,还是没能把它返回的 responseText 转成正确的编码格式
后来了解到,在XMLHttpRequest对象的 responseBody
属性中,保存了原始的数据信息 但prototype.js的AJAX功能返回的 responseBody
属性是 undefined,看来还是要自己动手了
经过近一个小时的敲打,一个短小精悍的AJAX框架腾空出世了,哈哈,不过功能还是很全的
里面某些写法借鉴了另一个轻量级的AJAX框架-bingo.js的实现方式
调用方式及注释: 复制代码 代码如下:
myAjaxCall({ url : 'xxxxx.jsp' //目标页面地址 ,params : URLEncoding
//参数串信息 ,method : 'POST' //发送方式POST or GET ,callBack : retValue
//回调函数名称 ,isBody : true //是否返回 responseBody ,默认返回
responseText //,isXml : false //是否以XML格式返回数据 //,errorReport :
false //发送错误时,是否弹出提示 //,attachs : {}
//附加的其他参数,可传递给回调函数 }); function retValue{ var strRet =
bytes2BSTR; } 注意看其中的两个函数: 、URLEncoding :对参数进行编码
、bytes2BSTR :对返回的数据进行解码
这两个函数直接借鉴了网络上很流行的两个编码函数,不过都是用vbs写的
需要把这两个函数也附加到上面的页面里: 复制代码 代码如下: Function URLEncoding
strReturn = "" For i = 1 To Len ThisChr = Mid If Abs < &HFF Then
strReturn = strReturn & ThisChr Else innerCode = Asc If innerCode < 0
Then innerCode = innerCode + &H10000 End If Hight8 = &HFF Low8 =
innerCode And &HFF strReturn = strReturn & "%" & Hex & "%" & Hex End If
Next URLEncoding = strReturn End Function Function bytes2BSTR strReturn
= "" For i = 1 To LenB ThisCharCode = AscB If ThisCharCode < &H80
Then strReturn = strReturn & Chr Else NextCharCode = AscB strReturn =
strReturn & Chr * &H100 + CInt i = i + 1 End If Next bytes2BSTR =
strReturn End Function 下面附上我写的轻量级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{ var attach;
if(requestJson && typeof requestJson == "object"){ if{myAjaxConfig.url =
requestJson.url;} if{myAjaxConfig.params = requestJson.params;}
if{myAjaxConfig.method = requestJson.method;} if{myAjaxConfig.callBack =
requestJson.callBack;} if{myAjaxConfig.isXml = requestJson.isXml;}
if{myAjaxConfig.isBody = requestJson.isBody;} if{myAjaxConfig.isCache =
requestJson.isCache;} if(requestJson.statePoll){myAjaxConfig.statePoll =
requestJson.statePoll;} if{myAjaxConfig.attachs = requestJson.attachs;}
} if(!myAjaxConfig.isCache){ var nocache = new Date;
if(myAjaxConfig.url.indexOf{myAjaxConfig.url += "&nocache=" + nocache;}
else{myAjaxConfig.url += "?nocache=" + nocache;} } var newCall = new
myAjaxCore; } 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; } }else if { 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;n=400){ _self.abort();
_self.alertf("ERROR:HTTP response code "+_httpRequest.status); }
if(_httpRequest.readyState==4 && _httpRequest.status==200){ var
response_content; if{ response_content = _澳门新葡亰登录,httpRequest.responseXML;
}else if{ 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;delete;};
this.alertf=function{if(myAjaxConfig.errorReport){alert;}}; } if{ var
browser={}; browser.IE = browser.ie =
window.navigator.userAgent.indexOf>0; browser.Firefox =
browser.firefox = browser.FF = browser.MF =
navigator.userAgent.indexOf>0; browser.Gecko = browser.gecko =
navigator.userAgent.indexOf>0; browser.Safari =
browser.safari=navigator.userAgent.indexOf>0; browser.Camino =
browser.camino=navigator.userAgent.indexOf>0; browser.Opera =
browser.opera=navigator.userAgent.indexOf>0; browser.other =
browser.OT=!(browser.IE || browser.FF || browser.Safari ||
browser.Camino || browser.Opera); }

            if (debugResponseText) {
                alert(x.responseText);
澳门新葡亰官方网站,            }

getTagValue(XMLDoc ,Tag )
获取XML文档指定TAG的第一次出现的值

       如果Open方法定义为POST,可以定义表单方式上传: 
       xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded") 

$F('div') 等同于
document.getElementById('div').value

 XMLHTTP方法: 
         备注:客户机可以使用XMLHTTP对象发送任意的HTTP请求,接受HTTP应答,还可以对应答的XML文档进行解析。 

下载 V 0.1.6 (5K,2007.1.16)  |   
语法:
AJAXCALL(url,handleResponse,param);
将回调的数据交给handleResponse处理
参数:url:请求的地址;handleResponse:回调函数,doc
为AJAX返回的文档;param:附加参数(isCache:是否需要缓存,默认不缓存;isXML:是否返回XML文档,默认HTML;method:发送方式,默认GET;attach:扩展参数,可以传递自定义的值,比如DIV的id等)
例子1: AJAXCALL("gaogao.xml","doPostXml","method=POST ,isXML=true
,isCache=true,attach=showContent");
function doPostXml(doc,id){
    alert(doc)//获取返回的XML文档
    alert(id)// 扩展参数,attach的值,"showContent"
    if(doc){
        $(id)=getTagValue(doc,retcode);
    }
}

 首先当然是要了解一下浏览器中的XMLHttp对象了:

V 0.1.6 (5K,2007.1.16) | 语法:
AJAXCALL(url,handleResponse,param) ; 将回调的数据交给handleResponse处理
参数: url:请求的地址;handleResponse:回调函...

        setRequestHeader( bstrHeader, bstrvalue )

例子2:
AJAXCALLl("getnews?pid=23412","shownews","attach="+$('yoyo'));
function shownews(docu,divObject){
    if(docu){
        divObject.innerHTML=docu;
    }else{
        divObject.innerHTML="系统错误";
    }
}

    x.open("POST", url, clientCallBack ? true : false);//以Post方式打开对象,这样在服务端就可以用Request.Form获取参数。
    x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    if (clientCallBack) {
        //如果同步,判断状态,输出错误消息。
        x.onreadystatechange = function() {
            var result = null;

 

XMLHTTP属性: 

获取新闻列表 | 登录 | 提交信息 | 读取JSON |
分页列表(bingo+json)[已升级V0.2] | SELECT无限联动 | TREE | 选取查询 |
像册(无限播放) | 多语言切换 | 查询下拉提示 |
标签浮动提示(仿网易新闻显示)

            try
            {
                var result = eval("(" + x.responseText + ")");
                if (debugErrors && result.error) {
                    alert("error: " + result.error);
                }
            }
            catch (err)
            {
                if (window.confirm('The following error occured while processing an AJAX request: ' + err.message + 'nnWould you like to see the response?'))
                {
                    var w = window.open();
                    w.document.open('text/plain');
                    w.document.write(x.responseText);
                   w.document.close();
               }

$U(str) 等同于encodeURIComponent(escape(str)

    if (!url)
    {
        url = window.location.href;
        url = url.replace(/#.*$/, '');//去除URL中标签部分,即"#"之后的字符串。
        //加入参数Ajax_CallBack并设为true,说明是AJAX回调。
        if (url.indexOf('?') > -1)
            url += "&Ajax_CallBack=true";
        else
        {
            if (url.substr(url.length - 1, 1) == "/")
                url += "default.aspx";

语法:AJAXFORM(formID,handleResponse,param);
将表单数据用AJAX POST出去
参数: formID:表单的ID;handleResponse:回调函数,doc
为AJAX返回文档;param:附加参数(isXML:是否返回XML文档,默认HTML;attach:扩展参数,可以传递自定义的值,比如DIV的id等)
例子:
<form id="form1" name="form1" method="post" action="ahaxtest2.php"
onsubmit="test3('form1');return
false;">
......................
function test3(postform){
    AJAXFORM(postform,"yoyo3","attach=showContent");
}
备注:数据会被escape编码,提交处理页面提供了PHP解码程序

        语法: 
        oXMLHttpRequest.send(varBody) 

转载本站文章请注明出处:澳门新葡亰官方网站 http://www.radioritmo-bl.com/?p=307

上一篇:

下一篇:

相关文章