国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

用javascript實現gb2312轉utf-8的腳本

2019-11-21 02:05:11
字體:
來源:轉載
供稿:網友
信息交換用漢字編碼字符集-基本集
漢字標準交換碼共分兩級。第一級為常用字,有3755字,按漢語拼音字母順序排列,第二級為次常用字,有3008字,按部首排列。GB2312的編碼范圍為2121H-777EH.
UNICODE 是兩字節的全編碼,對于ASCII字符它也使用兩字節表示。代碼頁是通過高字節的取值范圍來確定是ASCII字符,還是漢字的高字節。如果發生數據損壞, 某處內容破壞,則會引起其后漢字的混亂。UNICODE則一律使用兩個字節表示一個字符,最明顯的好處是它簡化了漢字的處理過程。
關于編碼的文章可以參考:
http://blog.iyi.cn/tech/2005/10/unicode_2.html
http://blog.iyi.cn/tech/2005/10/unicode.html

百度的頁面是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了,你自己改一下讀取路徑即可。

還需要注意的是,上面的程序是需要在服務器端運行的,因為涉及到文件操作。
javascript客戶端程序請看

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執行]

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高碑店市| 山阴县| 阳泉市| 西贡区| 磴口县| 镇平县| 青岛市| 湟源县| 石阡县| 修水县| 北票市| 遂溪县| 吕梁市| 奉新县| 昭平县| 瓦房店市| 乌审旗| 灵武市| 江达县| 洱源县| 安宁市| 武宣县| 天峻县| 罗源县| 阿拉善盟| 绥中县| 巢湖市| 永川市| 买车| 苏尼特左旗| 雅安市| 呼伦贝尔市| 汽车| 万荣县| 晋城| 高台县| 中方县| 嵊泗县| 前郭尔| 饶河县| 商城县|