序文
プロジェクトの開発中に遭遇したやや厄介な問題は、製品がブラウザのアドレス バーの検索語をブラウザから取得して判断する必要があることです。通常、エンコード形式は UTF-8 を使用しますが、Baidu と Google では検索語をエンコードする際に、 GBKエンコーディングが使用されます。結果的にデコードに失敗したので、ネットで解決策を探し、最終的に先輩がまとめてくれた方法を見つけ、iframe経由で問題を解決できたので、今後自分の便宜のためにまとめておきたいと思います、より多くの人に役立つことを願っています。最後にフロントエンドの記事へのリンクを貼ります。
1. エンコーディング (GBK および GB2312 をサポート)
トラブルを避けるために、フォームのリクエスト ページを現在のページに設定し、ページ JS の先頭にコールバック関数を置くことができます。このように、このページに親ページがあり、__encode__iframe__callback__ が定義されている場合、コールバックが呼び出されます。直接実行してウィンドウを閉じることができます。
if (parent.__encode__iframe__callback__) { // 現在のページが子ウィンドウであるかどうかを判断しますparent.__encode__iframe__callback__(location.search.split('=')[1]);
// 現在の子ウィンドウを直接閉じます window.close();
}
関数 GBKEncode(str, charset, callback) {
//フォームを作成し、accept-charset を通じてエンコードする
var form = document.createElement('form');
フォーム.メソッド = 'get';
form.style.display = 'なし';
form.acceptCharset = 文字セット;
if (document.all) {
//IE の場合は、 document.charset メソッドを呼び出します window.oldCharset = document.charset;
document.charset = 文字セット;
}
var input = document.createElement('input');
input.type = '非表示';
input.name = 'str';
入力値 = 文字列;
form.appendChild(入力);
form.target = '__encode__iframe__' // 送信されたターゲットの iframe を指定します。
document.body.appendChild(フォーム);
//送信された文字列をインターセプトした iframe を非表示 if (!window['__encode__iframe__']) {
var iframe;
iframe = document.createElement('iframe');
iframe.setAttribute('name', '__encode__iframe__');
iframe.style.display = 'なし';
iframe.width = "0";
iframe.height = "0";
iframe.scrolling = "いいえ";
iframe.allowtransparency = "true";
iframe.frameborder = "0";
iframe.src = 'about:blank' // 空白に設定します document.body.appendChild(iframe);
}
//
window.__encode__iframe__callback__ = 関数 (str) {
コールバック(文字列);
if (document.all) {
document.charset = window.oldCharset;
}
}
//コールバック エンコード ページのアドレスを設定します。これには、ユーザーが form.action = window.location.href を変更する必要があります。
form.submit();
setTimeout(関数() {
form.parentNode.removeChild(form);
iframe.parentNode.removeChild(iframe);
}, 1000) //0.5秒後にノードを削除}
GBKEncode('エンコードする必要がある文字', 'gb2312', callback);//テスト//プロミスのカプセル化 var encode = function encode(str) {
var charset = argument.length > 1 && 引数[1] !== 未定義の引数[1] : 'gbk';
return new Promise(function (解決、拒否) {
試す {
_encode(str, charset, function (data) {
解決(データ);
});
} キャッチ (e) {
solve('文字エンコードエラー。', e.toString());
}
});
};2. デコード(GBK、GB2312、Base64をサポート)
関数ランダムId() {
var text = "";
可能な変数 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 5; i++) {
text += possible.charAt(Math.floor(Math.random() * possible.length));
}テキストを返します。
}
関数 _decode(str, charset, callback) {
var script = document.createElement('script');
var id = randomId(); // 競合を防ぐために一意の ID を生成します script.id = '_urlDecodeFn_' + id;
window['_urlDecodeFn_' + id] = コールバック;
var src = 'data:text/javascript;charset=' + charset + (',_urlDecodeFn_' + id + '("') + str + '");';
src += 'document.getElementById("_urlDecodeFn_' + id + '").parentNode.removeChild(document.getElementById("_urlDecodeFn_' + id + '"));';
スクリプト.src = ソース;
document.body.appendChild(スクリプト);
}
_decode('デコードする文字', 'gb2312', callback) // テスト // プロミスのカプセル化 var decode = function decode(str) {
var charset = argument.length > 1 && 引数[1] !== 未定義の引数[1] : 'gbk';
return new Promise(function (解決、拒否) {
試す {
_decode(str, charset, 関数 (データ) {
解決(データ);
});
} キャッチ (e) {
solve('文字デコードエラー。', e.toString());
}
});
};参考リンク:https://zhuanlan.zhihu.com/p/35537480
文字列 GBK および GB2312 のエンコードとデコードのフロントエンド実装に関するこの記事はこれで終わりです (概要)。さらに関連する文字列 GBK および GB2312 のエンコードとデコードの内容については、downcodes.com で以前の記事を検索するか、以下の関連記事を参照してください。今後とも downcodes.com をさらにサポートしていただければ幸いです。