javascript gb2312轉utf-8

來源:互聯網
上載者:User

漢字標準交換碼共分兩級。第一級為常用字,有3755字,按漢語拼音字母順序排列,第二級為次常用字,有3008字,按部首排列。GB2312的編碼範圍為2121H-777EH.

UNICODE 是兩位元組的全編碼,對於ASCII字元它也使用兩位元組表示。字碼頁是通過高位元組的取值範圍來確定是ASCII字元,還是漢字的高位元組。如果發生資料損毀, 某處內容破壞,則會引起其後漢字的混亂。UNICODE則一律使用兩個位元組表示一個字元,最明顯的好處是它簡化了漢字的處理過程。

關於編碼的文章可以參考:


百度的頁面是gb2312的,URL編碼自然也是從gb轉換而來,比如“一”這個字,百度轉換的結果是D2%BB,而從Utf-8轉換來的結果是%E4%B8%80比如google(gb是2位元組編碼,utf-8是3位元組變長編碼)

可以用javascript的encodeURI和decodeURI來得到這些結果,設定頁面編碼就可以看到不同結果了。

在網上找,也沒找到現成的轉換程式,只得自己寫。還好網上不缺gb-utf的對照表,修改了一下就可以用了:gb-utf.txt

這個對照表是將gb位元組編碼轉到utf的16進位編碼,而不是位元組編碼。

javascript中escape和unescape是轉換16進位編碼用的,因此gb漢字到utf漢字的轉換思路是:encodeURI("gb漢字"),到對照表中尋找utf的16進位編碼,unescape("16進位utf編碼"),得到utf漢字。

中間那一步最關鍵,我的轉換隻用到了這一步,其他兩步直接調用那兩個函數就可以了。下面是轉換程式:

 function genCodeStr(){
    var codeRE = new RegExp("'(.*)' : '(.*)'","gi");
    var tempStr,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("%a1%a1") == -1){
        genCodeStr();
    }
    return new String(Application("codeData"));
}
function gb2utf(gbStr){
    var codeStr = getCodeStr();
    var codeRE = new RegExp("(%..%..)","gi");
    var replaceRE = new RegExp("(%..%..)","i");
    var gbCode;
    var utfCode;
    var gbStart;
    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);
    }
    return gbStr;
}

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了,你自己改一下讀取路徑即可。
還需要注意的是,上面的程式是需要在伺服器端啟動並執行,因為涉及到檔案操作。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.