Prefácio
Um problema bastante complicado que encontrei ao desenvolver um projeto é que o produto exige que os termos de pesquisa na barra de endereço do navegador sejam recuperados do navegador para julgamento. Geralmente usamos o formato de codificação UTF-8, mas Baidu e Google Ao codificar os termos de pesquisa, A codificação GBK é usada. Como resultado, a decodificação falhou, então procurei uma solução na Internet, e finalmente encontrei um método compilado por um idoso, e resolvi o problema através de iframe, então gostaria de resumi-lo para minha própria conveniência no futuro, e espero que possa ajudar mais pessoas, colocarei um link para o artigo inicial no final.
1. Codificação (suporta GBK e GB2312)
Para evitar problemas, podemos definir a página de solicitação do formulário para a página atual e colocar a função de retorno de chamada no início da página JS. Desta forma, quando esta página tiver uma página pai e __encode__iframe__callback__ estiver definido, o retorno de chamada. pode ser executado diretamente e janela fechada:
if (parent.__encode__iframe__callback__) { // Determine se a página atual é uma janela filha parent.__encode__iframe__callback__(location.search.split('=')[1]); //Fecha a janela filha atual diretamente window.close(); } função GBKEncode(str, conjunto de caracteres, retorno de chamada) { //Cria formulário e codifica através de accept-charset var formulário = document.createElement('formulário'); formulário.método = 'obter'; form.style.display = 'nenhum'; form.acceptCharset = conjunto de caracteres; if (documento.todos) { //Se for IE, então chame o método document.charset window.oldCharset = document.charset; documento.charset = conjunto de caracteres; } var entrada = document.createElement('input'); input.type = 'oculto'; entrada.nome = 'str'; entrada.valor = str; formulário.appendChild(entrada); form.target = '__encode__iframe__'; // Especifique o iframe do destino enviado document.body.appendChild(formulário); //Ocultar a string enviada interceptada pelo iframe if (!window['__encode__iframe__']) { var iframe; iframe = document.createElement('iframe'); iframe.setAttribute('nome', '__encode__iframe__'); iframe.style.display = 'nenhum'; iframe.largura = "0"; iframe.height = "0"; iframe.scrolling = "não"; iframe.allowtransparency = "true"; iframe.frameborder = "0"; iframe.src = 'about:blank'; // Definir como em branco document.body.appendChild(iframe); } // window.__encode__iframe__callback__ = função (str) { retorno de chamada(str); if (documento.todos) { document.charset = janela.oldCharset; } } //Defina o endereço da página de codificação de retorno de chamada, que requer que o usuário modifique form.action = window.location.href; formulário.submit(); setTimeout(função(){ formulário.parentNode.removeChild(formulário); iframe.parentNode.removeChild(iframe); }, 1000) //Remove o nó após 0,5 segundos} GBKEncode('Caracteres que precisam ser codificados', 'gb2312', callback);//Teste//Encapsulamento de promessa var encode = function encode(str) { var charset = argumentos.length > 1 && argumentos[1] !== indefinido argumentos[1] : 'gbk'; return nova Promessa(função (resolver, rejeitar) { tentar { _encode(str, conjunto de caracteres, função (dados) { resolver(dados); }); } pegar (e) { resolve('Erro de codificação de caracteres.', e.toString()); } }); };
2. Decodificação (suporta GBK, GB2312, Base64)
function randomId() { var texto = ""; var possível = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < 5; i++) { texto += possível.charAt(Math.floor(Math.random() * possível.comprimento)); }retorna texto; } função _decode(str, conjunto de caracteres, retorno de chamada) { var script = document.createElement('script'); var id = randomId(); // Gera um ID exclusivo para evitar conflitos script.id = '_urlDecodeFn_' + id; janela['_urlDecodeFn_' + id] = retorno de chamada; 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('Caracter a ser decodificado', 'gb2312', callback) // Teste // encapsulamento de promessa var decode = function decode(str) { var charset = argumentos.length > 1 && argumentos[1] !== indefinido argumentos[1] : 'gbk'; return nova Promessa(função (resolver, rejeitar) { tentar { _decode(str, conjunto de caracteres, função (dados) { resolver(dados); }); } pegar (e) { resolve('Erro de decodificação de caracteres.', e.toString()); } }); };
Link de referência: https://zhuanlan.zhihu.com/p/35537480
Isso conclui este artigo sobre a implementação front-end da codificação e decodificação de string GBK e GB2312 (resumo). Para obter mais conteúdo de codificação e decodificação de string GBK e GB2312, pesquise os artigos anteriores em downcodes.com ou continue navegando nos artigos relacionados, I. espero que você apoie mais o downcodes.com no futuro!