zoukankan      html  css  js  c++  java
  • xmlhttp中文乱码之客户端解决方案

    xmlhttp中文乱码之客户端解决方案
    2006-10-23 01:45

    使用ajax的人,最头疼的莫过于处理返回的中文乱码问题。如果可以在服务器进行操作的话,这个问题并不复杂。问题是有时候我们没有在服务器端进行操作的权利。例如,你想获取的是新浪的首页。你唯一能做的就是在客户端进行处理。

    xmlhttp返回的对象可以是:responseText,responseXML和responseBody。其中responseText和responseXML是按照UTF-8的编码方式去抓取目标页面。responseBody返回的是目标页面的二进制数据流。对于那些不是以UTF-8编码的目标页面,我们是无法通过使用responseText,responseXML这两种方式获取无乱码的中文页面的。这时我们可以通过responseBody方式返回目标页面的二进制数据流,然后对数据流进行客户端的转化就可以。下面是我在网上找到的分别用vbscript和javascript解决这个问题的方法。

    <script language="VBScript">
    function bin2str(bin)
    dim tmp,ustr
    tmp=""
    for i=1 to LenB(bin)-1
    ustr=AscB(MidB(bin,i,1))
    if ustr>127 then
    i=i+1
    tmp=tmp&chr(ustr*256+AscB(MidB(bin,i,1)))
    else
    tmp=tmp&chr(ustr)
    end if
    next
    bin2str=tmp
    end function
    </script>


    <script language="javascript">
    var adTypeBinary = 1
    var adTypeText = 2
    function bytes2bstr(vin){
    var st = new ActiveXObject("adodb.stream")
    with (st){
    Type = adTypeText
    Open()
    WriteText(vin)
    Position = 0
    Charset = "GB2312"
    Position = 2
    return ReadText
    }
    }
    </script>

    下面是我成功解决该问题的完整文件

    <html>
    <head>
    <title>ajax encoding</title>
    <script language="javascript" type="text/javascript">

    var xmlhttp;
    function CreateXMLHttpRequest() {
    xmlhttp=false;
    if(window.XMLHttpRequest) {
    xmlhttp=new XMLHttpRequest();
    if (xmlhttp.overrideMimeType) {
    xmlhttp.overrideMimeType('text/xml');
    }
    } else if(window.ActiveXObject) {
    try{
    xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
    try{
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) { }
    }
    }
    }

    function load() {
    CreateXMLHttpRequest();
    if(!xmlhttp) {
    document.getElementById("error").innerHTML="对不起,服务器有故障,不能传送数据!";
    return false;
    } else {
    xmlhttp.onreadystatechange=process;
    URL="http://www.sina.com.cn/";
    xmlhttp.open('post',URL,false);
    xmlhttp.send(null);
    }
    }

    function process() {
    if(xmlhttp.readyState==4) {
    if(xmlhttp.status==200) {
    var info = gb2utf8(xmlhttp.responseBody);
    document.write(info);
    } else {
    alert(xmlhttp.status);
    }
    }
    }

    function gb2utf8(data){
    var glbEncode = [];
    gb2utf8_data = data;
    execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
    var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2");
    t=t.split("@");
    var i=0,j=t.length,k;
    while(++i<j) {
    k=t[i].substring(0,4);
    if(!glbEncode[k]) {
    gb2utf8_char = eval("0x"+k);
    execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
    glbEncode[k]=escape(gb2utf8_char).substring(1,6);
    }
    t[i]=glbEncode[k]+t[i].substring(4);
    }
    gb2utf8_data = gb2utf8_char = null;
    return unescape(t.join("%"));
    }

    </script>

    </head>

    <body onload="load()">
    <div id="error"></div>
    </body>

    </html>

  • 相关阅读:
    armlinuxgnueabihf、aarch64linuxgnu等ARM交叉编译GCC的区别
    《JAVA与模式》之简单工厂模式
    wget常用命令
    sublime text添加Jquery插件
    e = e || window.event用法细节讨论
    配置运行 Compilify.net
    [翻译].NET中的Command(命令)模式
    EF Code First 中使用Jarek Kowalski's Provider的方法1
    WF实例学习笔记:(1)准备工作
    Entity Framework Code First Caching
  • 原文地址:https://www.cnblogs.com/y0umer/p/3839332.html
Copyright © 2011-2022 走看看