Préface
Un problème délicat que j'ai rencontré lors du développement d'un projet était que le produit nécessite que les termes de recherche dans la barre d'adresse du navigateur soient récupérés à partir du navigateur pour jugement. Nous utilisons généralement le format d'encodage UTF-8, mais Baidu et Google lors de l'encodage des termes de recherche, Le codage GBK est utilisé. En conséquence, le décodage a échoué, j'ai donc cherché une solution sur Internet, et j'ai finalement trouvé une méthode compilée par un senior et j'ai résolu le problème via iframe, j'aimerais donc le résumer pour ma propre convenance à l'avenir, et j'espère que cela pourra aider plus de gens, je mettrai un lien vers l'article frontal à la fin.
1. Encodage (prend en charge GBK et GB2312)
Afin d'éviter des problèmes, nous pouvons définir la page de requête du formulaire sur la page actuelle et placer la fonction de rappel au début de la page JS. De cette façon, lorsque cette page a une page parent et que __encode__iframe__callback__ est défini, le rappel. peut être exécuté directement et fermé la fenêtre :
if (parent.__encode__iframe__callback__) { // Détermine si la page actuelle est une fenêtre enfant parent.__encode__iframe__callback__(location.search.split('=')[1]); //Ferme directement la fenêtre enfant actuelle window.close(); } function GBKEncode(str, charset, rappel) { //Créer un formulaire et encoder via accept-charset var form = document.createElement('form'); form.method = 'obtenir'; form.style.display = 'aucun'; form.acceptCharset = jeu de caractères ; si (document.all) { //S'il s'agit d'IE, appelez la méthode document.charset window.oldCharset = document.charset; document.charset = jeu de caractères ; } var input = document.createElement('input'); input.type = 'caché'; input.name = 'str'; input.value = str; form.appendChild(entrée); form.target = '__encode__iframe__'; // Spécifie l'iframe de la cible soumise document.body.appendChild(formulaire); //Masquer la chaîne soumise interceptée par l'iframe if (!window['__encode__iframe__']) { var iframe ; iframe = document.createElement('iframe'); iframe.setAttribute('nom', '__encode__iframe__'); iframe.style.display = 'aucun'; iframe.width = "0" ; iframe.hauteur = "0" ; iframe.scrolling = "non" ; iframe.allowtransparency = "true" ; iframe.frameborder = "0"; iframe.src = 'about:blank'; // Définir comme vide document.body.appendChild(iframe); } // window.__encode__iframe__callback__ = fonction (str) { rappel(str); si (document.all) { document.charset = window.oldCharset; } } //Définit l'adresse de la page d'encodage de rappel, qui nécessite que l'utilisateur modifie form.action = window.location.href; form.submit(); setTimeout (fonction () { form.parentNode.removeChild(form); iframe.parentNode.removeChild(iframe); }, 1000) //Supprimer le nœud après 0,5 seconde} GBKEncode('Caractères à encoder', 'gb2312', callback);//Test//Encapsulation de promesse var encode = function encode(str) { var charset = arguments.length > 1 && arguments[1] !== non défini arguments[1] : 'gbk'; retourner une nouvelle promesse (fonction (résoudre, rejeter) { essayer { _encode(str, jeu de caractères, fonction (données) { résoudre (données); }); } attraper (e) { solve('Erreur d'encodage des caractères.', e.toString()); } }); } ;
2. Décodage (prend en charge GBK, GB2312, Base64)
fonction randomId() { var texte = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; pour (var je = 0; je < 5; je++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); }retourne le texte ; } function _decode(str, charset, rappel) { var script = document.createElement('script'); var id = randomId(); // Génère un identifiant unique pour éviter les conflits script.id = '_urlDecodeFn_' + id; window['_urlDecodeFn_' + id] = rappel ; 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('Caractère à décoder', 'gb2312', callback) // Test // promesse d'encapsulation var decode = function decode(str) { var charset = arguments.length > 1 && arguments[1] !== non défini arguments[1] : 'gbk'; retourner une nouvelle promesse (fonction (résoudre, rejeter) { essayer { _decode(str, jeu de caractères, fonction (données) { résoudre (données); }); } attraper (e) { solve('Erreur de décodage de caractère.', e.toString()); } }); } ;
Lien de référence : https://zhuanlan.zhihu.com/p/35537480
Ceci conclut cet article sur l'implémentation frontale de l'encodage et du décodage des chaînes GBK et GB2312 (résumé). Pour plus de contenu sur l'encodage et le décodage des chaînes GBK et GB2312, veuillez rechercher les articles précédents sur downcodes.com ou continuer à parcourir les articles connexes ci-dessous. j'espère que vous soutiendrez davantage downcodes.com à l'avenir !