Vorwort
Ein kniffliges Problem, auf das ich bei der Entwicklung eines Projekts gestoßen bin, war, dass das Produkt zur Beurteilung die Suchbegriffe in der Browser-Adressleiste vom Browser abrufen muss. Wir verwenden im Allgemeinen das UTF-8-Codierungsformat, aber Baidu und Google Bei der Codierung von Suchbegriffen. Es wird GBK-Kodierung verwendet Infolgedessen schlug die Dekodierung fehl, also suchte ich im Internet nach einer Lösung, fand schließlich eine von einem Senior zusammengestellte Methode und löste das Problem über iframe. Daher möchte ich es in Zukunft zu meiner eigenen Bequemlichkeit zusammenfassen. und ich hoffe, dass es mehr Menschen helfen kann. Ich werde am Ende einen Link zum Front-End-Artikel einfügen.
1. Kodierung (unterstützt GBK und GB2312)
Um Probleme zu vermeiden, können wir die Anforderungsseite des Formulars auf die aktuelle Seite festlegen und die Rückruffunktion an den Anfang der Seite setzen. JS Auf diese Weise wird der Rückruf aufgerufen, wenn diese Seite eine übergeordnete Seite hat und __encode__iframe__callback__ definiert ist kann direkt und bei geschlossenem Fenster ausgeführt werden:
if (parent.__encode__iframe__callback__) { // Bestimmen Sie, ob die aktuelle Seite ein untergeordnetes Fenster ist parent.__encode__iframe__callback__(location.search.split('=')[1]); //Das aktuelle untergeordnete Fenster direkt schließen window.close(); } Funktion GBKEncode(str, charset, callback) { //Formular erstellen und mit Accept-Charset kodieren var form = document.createElement('form'); form.method = 'get'; form.style.display = 'none'; form.acceptCharset = charset; if (document.all) { //Wenn es sich um einen IE handelt, rufen Sie die Methode document.charset auf window.oldCharset = document.charset; document.charset = charset; } var input = document.createElement('input'); input.type = 'versteckt'; input.name = 'str'; input.value = str; form.appendChild(input); form.target = '__encode__iframe__'; // Geben Sie den Iframe des übermittelten Ziels an document.body.appendChild(form); //Von Iframe abgefangene übermittelte Zeichenfolge ausblenden 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 = "nein"; iframe.allowtransparency = "true"; iframe.frameborder = "0"; iframe.src = 'about:blank'; // Auf leer setzen document.body.appendChild(iframe); } // window.__encode__iframe__callback__ = function (str) { Rückruf(str); if (document.all) { document.charset = window.oldCharset; } } //Legen Sie die Adresse der Callback-Codierungsseite fest, die vom Benutzer geändert werden muss form.action = window.location.href; form.submit(); setTimeout(function () { form.parentNode.removeChild(form); iframe.parentNode.removeChild(iframe); }, 1000) //Knoten nach 0,5 Sekunden entfernen} GBKEncode('Zeichen, die codiert werden müssen', 'gb2312', Rückruf);//Test//Kapselung versprechen var encode = function encode(str) { var charset = arguments.length > 1 && arguments[1] !== undefiniert ? arguments[1] : 'gbk'; neues Versprechen zurückgeben (Funktion (auflösen, ablehnen) { versuchen { _encode(str, charset, function (data) { auflösen(Daten); }); } fangen (e) { lösen('Zeichenkodierungsfehler.', e.toString()); } }); };
2. Dekodierung (unterstützt GBK, GB2312, Base64)
Funktion randomId() { var text = ""; var möglich = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; für (var i = 0; i < 5; i++) { text += möglich.charAt(Math.floor(Math.random() * möglich.länge)); }Rückgabetext; } Funktion _decode(str, charset, callback) { var script = document.createElement('script'); var id = randomId(); // Eine eindeutige ID generieren, um Konflikte zu verhindern script.id = '_urlDecodeFn_' + id; window['_urlDecodeFn_' + id] = Rückruf; 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('Zu dekodierendes Zeichen', 'gb2312', Rückruf) // Test // Kapselung versprechen var decode = function decode(str) { var charset = arguments.length > 1 && arguments[1] !== undefiniert ? arguments[1] : 'gbk'; neues Versprechen zurückgeben (Funktion (auflösen, ablehnen) { versuchen { _decode(str, charset, function (data) { auflösen(Daten); }); } fangen (e) { lösen('Fehler bei der Zeichendekodierung.', e.toString()); } }); };
Referenzlink: https://zhuanlan.zhihu.com/p/35537480
Damit ist dieser Artikel über die Front-End-Implementierung der String-GBK- und GB2312-Codierung und -Decodierung abgeschlossen (Zusammenfassung). Weitere verwandte String-GBK- und GB2312-Codierungs- und Decodierungsinhalte finden Sie in früheren Artikeln auf downcodes.com oder weiter unten in verwandten Artikeln Ich hoffe, dass Sie downcodes.com in Zukunft stärker unterstützen werden!