javascript gb2312转utf-8

来源:互联网 发布:基于thinkphp的cms开发 编辑:程序博客网 时间:2024/06/08 18:59

汉字标准交换码共分两级。第一级为常用字,有3755字,按汉语拼音字母顺序排列,第二级为次常用字,有3008字,按部首排列。GB2312的编码范围为2121H-777EH.

UNICODE是两字节的全编码,对于ASCII字符它也使用两字节表示。代码页是通过高字节的取值范围来确定是ASCII字符,还是汉字的高字节。如果发生数据损坏,某处内容破坏,则会引起其后汉字的混乱。UNICODE则一律使用两个字节表示一个字符,最明显的好处是它简化了汉字的处理过程。

关于编码的文章可以参考:


百度的页面是gb2312的,URL编码自然也是从gb转换而来,比如“一”这个字,百度转换的结果是D2�,而从Utf-8转换来的结果是一比如google(gb是2字节编码,utf-8是3字节变长编码)

可以用javascript的encodeURI和decodeURI来得到这些结果,设置页面编码就可以看到不同结果了。

在网上找,也没找到现成的转换程序,只得自己写。还好网上不缺gb-utf的对照表,修改了一下就可以用了:gb-utf.txt

这个对照表是将gb字节编码转到utf的16进制编码,而不是字节编码。

javascript中escape和是转换16进制编码用的,因此gb汉字到utf汉字的转换思路是:encodeURI("gb汉字"),到对照表中查找utf的16进制编码,("16进制utf编码"),得到utf汉字。

中间那一步最关键,我的转换只用到了这一步,其他两步直接调用那两个函数就可以了。下面是转换程序:

 

 function genCodeStr(){
    var codeRE =new RegExp("'(.*)' : '(.*)'","gi");
    vartempStr,codeStr = "";
    var myReader= new Reader();
   myReader.loadFile('inc/gb2312_utf.txt');//这里改成你的对照表存放的路径
   while(!myReader.fStream.atEndofLine) {
       tempStr = new String(myReader.fStream.readLine());
       codeStr += tempStr.replace(codeRE,"$1") + ":" +tempStr.replace(codeRE,"$2") + ":";
    }
   Application("codeData") = codeStr;
}
function getCodeStr(){
    var codeStr= new String(Application("codeData"));
   if(codeStr.indexOf("��") == -1){
       genCodeStr();
    }
    return newString(Application("codeData"));
}
function gb2utf(gbStr){
    var codeStr= getCodeStr();
    var codeRE =new RegExp("(%..%..)","gi");
    varreplaceRE = new RegExp("(%..%..)","i");
    vargbCode;
    varutfCode;
    vargbStart;
   while((codeRE.lastIndex < gbStr.length)&& replaceRE.test(gbStr)){
       codeRE.exec(gbStr);
       gbCode = new String(RegExp.$1);
       gbStart = new Number(codeStr.indexOf(gbCode.toLowerCase()));
       var utfStart = 0;
       if(gbStart != -1){
           utfStart= gbStart + 7;
           utfCode = codeStr.substring(utfStart,utfStart + 6);
       }else{
           utfCode = "%u3000";
       }
       gbStr = gbStr.replace(replaceRE,utfCode);
    }
    returngbStr;
}

function Reader(){                       //Class       Reader()
   this.fso;                           //Private   fso
   this.fUri;                           //Private   fUri
   this.fStream;                       //Private   fStream
    try{
       this.fso = new ActiveXObject("Scripting.FileSystemObject");
   }catch(exception) {
       throw exception;
    }
   this.loadFile = function(file){       //Public       loadFile(file)
           this.fUri = Server.mappath(file);
           //var fStream = fso.CreateTextFile(tfolder,true,false);
           //fStream.WriteLine('test');
           if(this.fso.fileExists(this.fUri)){
               this.fStream = this.fso.openTextFile(this.fUri);
           }else{
               Response.write('file dos not exist');
           }
    }
   this.readLineN = function(num) {
       var i = 1;
       while(i < num &&!this.fStream.atEndOfLine) {
           this.fStream.skipLine();
           i++
       }
       return this.fStream.readLine();
    }
   this.closeFile = function() {
       fStream.Close();
       fso.Close;
    }
}


对照表就是gb-utf.txt了,你自己改一下读取路径即可。
还需要注意的是,上面的程序是需要在服务器端运行的,因为涉及到文件操作。