Prefacio
Un problema complicado que encontré al desarrollar un proyecto fue que el producto requiere que los términos de búsqueda en la barra de direcciones del navegador se recuperen del navegador para juzgarlos. Generalmente usamos el formato de codificación UTF-8, pero Baidu y Google Al codificar los términos de búsqueda. Se utiliza la codificación GBK. Como resultado, la decodificación falló, así que busqué una solución en Internet y finalmente encontré un método compilado por un senior y resolví el problema a través de iframe, por lo que me gustaría resumirlo para mi propia conveniencia en el futuro. Y espero que pueda ayudar a más personas. Gente, pondré un enlace al artículo inicial al final.
1. Codificación (compatible con GBK y GB2312)
Para evitar problemas, podemos configurar la página de solicitud del formulario en la página actual y colocar la función de devolución de llamada al frente de la página JS. De esta manera, cuando esta página tiene una página principal y se define __encode__iframe__callback__, la devolución de llamada. Se puede ejecutar directamente y cerrar la ventana:
if (parent.__encode__iframe__callback__) { // Determinar si la página actual es una ventana secundaria parent.__encode__iframe__callback__(location.search.split('=')[1]); //Cierra la ventana secundaria actual directamente window.close(); } función GBKEncode(cadena, juego de caracteres, devolución de llamada) { //Crear formulario y codificar mediante aceptar-charset formulario var = document.createElement('formulario'); formulario.metodo = 'obtener'; form.style.display = 'ninguno'; form.acceptCharset = juego de caracteres; si (documento.todo) { // Si es IE, llame al método document.charset window.oldCharset = document.charset; documento.charset = juego de caracteres; } var entrada = document.createElement('entrada'); input.type = 'oculto'; entrada.nombre = 'cadena'; entrada.valor = cadena; formulario.appendChild(entrada); form.target = '__encode__iframe__'; // Especifica el iframe del objetivo enviado documento.body.appendChild(formulario); //Ocultar iframe cadena enviada interceptada if (!window['__encode__iframe__']) { var marco flotante; marco flotante = document.createElement('marco flotante'); iframe.setAttribute('nombre', '__encode__iframe__'); iframe.style.display = 'ninguno'; iframe.ancho = "0"; iframe.altura = "0"; iframe.scrolling = "no"; iframe.allowtransparency = "verdadero"; iframe.frameborder = "0"; iframe.src = 'about:blank'; // Establecer en blanco document.body.appendChild(iframe); } // ventana.__encode__iframe__callback__ = función (cadena) { devolución de llamada (cadena); si (documento.todo) { documento.charset = ventana.oldCharset; } } // Establece la dirección de la página de codificación de devolución de llamada, lo que requiere que el usuario modifique form.action = window.location.href; formulario.enviar(); setTimeout(función() { form.parentNode.removeChild(formulario); iframe.parentNode.removeChild(iframe); }, 1000) //Eliminar nodo después de 0,5 segundos} GBKEncode('Caracteres que deben codificarse', 'gb2312', devolución de llamada);//Prueba//Encapsulación de promesa var encode = function encode(str) { var conjunto de caracteres = argumentos.longitud > 1 && argumentos[1]!== argumentos indefinidos[1]: 'gbk'; devolver nueva Promesa (función (resolver, rechazar) { intentar { _encode(cadena, juego de caracteres, función (datos) { resolver(datos); }); } atrapar (e) { resolve('Error de codificación de caracteres', e.toString()); } }); };
2. Decodificación (compatible con GBK, GB2312, Base64)
función ID aleatorio() { var texto = ""; var posible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; para (var i = 0; i < 5; i++) { texto += posible.charAt(Math.floor(Math.random() * posible.longitud)); }devolver texto; } función _decode(cadena, juego de caracteres, devolución de llamada) { var script = document.createElement('script'); var id = randomId(); // Genera una identificación única para evitar conflictos script.id = '_urlDecodeFn_' + id; ventana['_urlDecodeFn_' + id] = devolución de llamada; var src = 'data:text/javascript;charset=' + charset + (',_urlDecodeFn_' + id + '("') + str + '");'; src += 'document.getElementById("_urlDecodeFn_' + id + '").parentNode.removeChild(document.getElementById("_urlDecodeFn_' + id + '"));'; script.src = src; documento.body.appendChild(guión); } _decode('Carácter a decodificar', 'gb2312', devolución de llamada) // Prueba // promesa de encapsulación var decode = function decode(str) { var conjunto de caracteres = argumentos.longitud > 1 && argumentos[1]!== argumentos indefinidos[1]: 'gbk'; devolver nueva Promesa (función (resolver, rechazar) { intentar { _decode(cadena, juego de caracteres, función (datos) { resolver(datos); }); } atrapar (e) { resolve('Error de decodificación de caracteres', e.toString()); } }); };
Enlace de referencia: https://zhuanlan.zhihu.com/p/35537480
Con esto concluye este artículo sobre la implementación front-end de la codificación y decodificación de cadenas GBK y GB2312 (resumen). Para obtener más contenido relacionado con la codificación y decodificación de cadenas GBK y GB2312, busque artículos anteriores en downcodes.com o continúe navegando a continuación. ¡Espero que apoyes más a downcodes.com en el futuro!