Kata pengantar
Masalah yang agak rumit yang saya temui ketika mengembangkan sebuah proyek adalah bahwa produk memerlukan istilah pencarian di bilah alamat browser untuk diambil dari browser untuk penilaian. Kami biasanya menggunakan format pengkodean UTF-8, tetapi Baidu dan Google Saat mengkodekan istilah pencarian, Pengkodean GBK digunakan Akibatnya decoding gagal, jadi saya mencari solusi di Internet, dan akhirnya menemukan metode yang dikompilasi oleh senior, dan menyelesaikan masalah melalui iframe, jadi saya ingin merangkumnya untuk kenyamanan saya sendiri di masa depan, dan saya harap ini dapat membantu lebih banyak orang. Teman-teman, saya akan memasang link ke artikel front-end di akhir.
1. Pengkodean (mendukung GBK dan GB2312)
Untuk menghindari masalah, kita dapat mengatur halaman permintaan formulir ke halaman saat ini dan meletakkan fungsi panggilan balik di depan halaman JS Dengan cara ini, ketika halaman ini memiliki halaman induk dan __encode__iframe__callback__ ditentukan, panggilan balik tersebut. dapat dieksekusi secara langsung dan menutup jendela:
if (parent.__encode__iframe__callback__) { // Tentukan apakah halaman saat ini merupakan jendela turunan parent.__encode__iframe__callback__(location.search.split('=')[1]); //Menutup jendela anak saat ini secara langsung window.close(); } fungsi GBKEncode(str, charset, callback) { //Buat formulir dan enkode melalui terima-charset var form = dokumen.createElement('form'); form.method = 'dapatkan'; form.style.display = 'tidak ada'; form.acceptCharset = rangkaian karakter; if (dokumen.semua) { //Jika IE, panggil metode document.charset window.oldCharset = document.charset; dokumen.charset = charset; } var masukan = dokumen.createElement('input'); input.type = 'tersembunyi'; masukan.nama = 'str'; masukan.nilai = str; form.appendChild(masukan); form.target = '__encode__iframe__'; // Tentukan iframe dari target yang dikirimkan document.body.appendChild(form); //Sembunyikan string yang dikirimkan iframe yang dicegat if (!window['__encode__iframe__']) { var iframe; iframe = dokumen.createElement('iframe'); iframe.setAttribute('nama', '__encode__iframe__'); iframe.style.display = 'tidak ada'; iframe.lebar = "0"; iframe.tinggi = "0"; iframe.scrolling = "tidak"; iframe.allowtransparency = "benar"; iframe.frameborder = "0"; iframe.src = 'about:blank'; // Setel ke document.body.appendChild(iframe); } // window.__encode__iframe__callback__ = fungsi (str) { panggilan balik(str); if (dokumen.semua) { dokumen.charset = window.oldCharset; } } //Tetapkan alamat halaman pengkodean panggilan balik, yang mengharuskan pengguna untuk mengubah form.action = window.location.href; formulir.kirim(); setTimeout(fungsi () { form.parentNode.removeChild(form); iframe.parentNode.removeChild(iframe); }, 1000) //Hapus node setelah 0,5 detik} GBKEncode('Karakter yang perlu dikodekan', 'gb2312', callback);//Test//Janji enkapsulasi var encode = function encode(str) { var charset = argumen.panjang > 1 && argumen[1] !== tidak terdefinisi ? argumen[1] : 'gbk'; kembalikan Janji baru(fungsi (putuskan, tolak) { mencoba { _encode(str, rangkaian karakter, fungsi (data) { tekad(data); }); } tangkapan (e) { tekad('Kesalahan pengkodean karakter.', e.toString()); } }); };
2. Dekode (mendukung GBK, GB2312, Base64)
fungsi acakId() { var teks = ""; var mungkin = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; untuk (var saya = 0; saya < 5; saya++) { teks += mungkin.charAt(Matematika.lantai(Matematika.acak() * mungkin.panjang)); }mengembalikan teks; } fungsi _decode(str, rangkaian karakter, panggilan balik) { var skrip = dokumen.createElement('skrip'); var id = randomId(); // Buat ID unik untuk mencegah konflik script.id = '_urlDecodeFn_' + id; window['_urlDecodeFn_' + id] = panggilan balik; var src = 'data:teks/javascript;charset=' + charset + (',_urlDecodeFn_' + id + '("') + str + '");'; src += 'document.getElementById("_urlDecodeFn_' + id + '").parentNode.removeChild(document.getElementById("_urlDecodeFn_' + id + '"));'; skrip.src = src; document.body.appendChild(skrip); } _decode('Karakter yang akan didekode', 'gb2312', callback) // Uji // enkapsulasi janji var decode = function decode(str) { var charset = argumen.panjang > 1 && argumen[1] !== tidak terdefinisi ? argumen[1] : 'gbk'; kembalikan Janji baru(fungsi (putuskan, tolak) { mencoba { _decode(str, rangkaian karakter, fungsi (data) { tekad(data); }); } tangkapan (e) { tekad('Kesalahan decoding karakter.', e.toString()); } }); };
Tautan referensi: https://zhuanlan.zhihu.com/p/35537480
Ini menyimpulkan artikel ini tentang implementasi front-end dari pengkodean dan dekode string GBK dan GB2312 (ringkasan). Untuk konten pengkodean dan dekode string GBK dan GB2312 yang lebih terkait, silakan cari artikel sebelumnya di downcodes.com atau lanjutkan penelusuran di bawah harap Anda akan lebih mendukung downcodes.com di masa mendatang!