最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端實現(xiàn)字符串GBK與GB2312的編解碼(小結)

  發(fā)布時間:2020-12-02 16:15:11   作者:快樂的前端小菜鳥   我要評論
這篇文章主要介紹了前端實現(xiàn)字符串GBK與GB2312的編解碼(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

在開發(fā)項目的時候遇到的一個比較坑的問題,產品要求從瀏覽器拿到瀏覽器地址欄里面的搜索詞進行判斷,我們一般使用的都是UTF-8的編碼格式,但是百度和谷歌在對搜索詞編碼的時候都是使用的GBK編碼,這就導致,解碼失敗,于是就在網(wǎng)上找解決方法,最終找到了一位前輩整理出來的方法,通過iframe解決了這個問題,所以特此總結一下,方便自己以后使用,也希望能幫助到更多的人,最后會放上前端文章的鏈接。

1、編碼(支持GBK和GB2312)

為了避免麻煩,我們可以將表單的請求頁面設定為當前頁面,將回調函數(shù)放在頁面JS的最前面,這樣當此頁面存在父頁面并且__encode__iframe__callback__定義了,就可以直接執(zhí)行回調,并關閉窗口:

if (parent.__encode__iframe__callback__) { // 判斷當前頁面是否為子窗口
    parent.__encode__iframe__callback__(location.search.split('=')[1]);
    //直接關閉當前子窗口
    window.close();
}
function GBKEncode(str, charset, callback) {
    //創(chuàng)建form通過accept-charset做encode
    var form = document.createElement('form');
    form.method = 'get';
    form.style.display = 'none';
    form.acceptCharset = charset;
    if (document.all) {
        //如果是IE那么就調用document.charset方法
        window.oldCharset = document.charset;
        document.charset = charset;
    }
    var input = document.createElement('input');
    input.type = 'hidden';
    input.name = 'str';
    input.value = str;
    form.appendChild(input);
    form.target = '__encode__iframe__'; // 指定提交的目標的iframe
    document.body.appendChild(form);
    //隱藏iframe截獲提交的字符串
    if (!window['__encode__iframe__']) {
        var iframe;
        iframe = document.createElement('iframe');
        iframe.setAttribute('name', '__encode__iframe__');
        iframe.style.display = 'none';
        iframe.width = "0";
        iframe.height = "0";
        iframe.scrolling = "no";
        iframe.allowtransparency = "true";
        iframe.frameborder = "0";
        iframe.src = 'about:blank'; // 設置為空白
        document.body.appendChild(iframe);
    }
    //
    window.__encode__iframe__callback__ = function (str) {
        callback(str);
        if (document.all) {
            document.charset = window.oldCharset;
        }
    }
    //設置回調編碼頁面的地址,這里需要用戶修改
    form.action = window.location.href;
    form.submit();
    setTimeout(function () {
        form.parentNode.removeChild(form);
        iframe.parentNode.removeChild(iframe);
    }, 1000) // 0.5秒后移除節(jié)點
}
GBKEncode('需要編碼的字符', 'gb2312', callback);// 測試

// promise封裝
var encode = function encode(str) {
    var charset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gbk';
    return new Promise(function (resolve, reject) {
        try {
            _encode(str, charset, function (data) {
                resolve(data);
            });
        } catch (e) {
            resolve('字符編碼錯誤.', e.toString());
        }
    });
};

二、解碼(支持GBK、GB2312、Base64)

function randomId() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 5; i++) {
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }return text;
}

function _decode(str, charset, callback) {
    var script = document.createElement('script');
    var id = randomId(); // 生成唯一ID,防止沖突
    script.id = '_urlDecodeFn_' + id;
    window['_urlDecodeFn_' + id] = callback;
    var src = 'data:text/javascript;charset=' + charset + (',_urlDecodeFn_' + id + '("') + str + '");';
    src += 'document.getElementById("_urlDecodeFn_' + id + '").parentNode.removeChild(document.getElementById("_urlDecodeFn_' + id + '"));';
    script.src = src;
    document.body.appendChild(script);
}
_decode('需要解碼的字符', 'gb2312', callback) // 測試

// promise封裝
var decode = function decode(str) {
    var charset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gbk';
    return new Promise(function (resolve, reject) {
        try {
            _decode(str, charset, function (data) {
                resolve(data);
            });
        } catch (e) {
            resolve('字符解碼錯誤.', e.toString());
        }
    });
};

參考鏈接:https://zhuanlan.zhihu.com/p/35537480

到此這篇關于前端實現(xiàn)字符串GBK與GB2312的編解碼(小結)的文章就介紹到這了,更多相關字符串GBK與GB2312的編解碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

相關文章

最新評論

奉节县| 松江区| 辉南县| 封开县| 曲阳县| 鄱阳县| 厦门市| 万安县| 仁怀市| 华宁县| 丹巴县| 连平县| 潢川县| 天台县| 牙克石市| 康平县| 沭阳县| 长治市| 伽师县| 昌宁县| 聊城市| 仙桃市| 庆云县| 遵化市| 洪雅县| 土默特左旗| 延长县| 达尔| 西贡区| 青海省| 巴塘县| 惠安县| 丽江市| 如皋市| 沧州市| 南溪县| 丹阳市| 来宾市| 邯郸市| 星子县| 广东省|