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!