คำนำ
ปัญหาที่ค่อนข้างยุ่งยากที่ฉันพบเมื่อพัฒนาโครงการคือผลิตภัณฑ์ต้องการคำค้นหาในแถบที่อยู่ของเบราว์เซอร์เพื่อดึงข้อมูลจากเบราว์เซอร์เพื่อการตัดสิน โดยทั่วไปเราใช้รูปแบบการเข้ารหัส 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, ชุดอักขระ, โทรกลับ) {
//สร้างแบบฟอร์มและเข้ารหัสผ่านชุดอักขระที่ยอมรับ
รูปแบบ var = document.createElement('form');
form.method = 'รับ';
form.style.display = 'ไม่มี';
form.acceptCharset = ชุดอักขระ;
ถ้า (document.all) {
//ถ้าเป็น IE ให้เรียกเมธอด document.charset window.oldCharset = document.charset;
document.charset = ชุดอักขระ;
-
อินพุต var = document.createElement('อินพุต');
input.type = 'ซ่อน';
input.name = 'str';
อินพุตค่า = str;
form.appendChild(อินพุต);
form.target = '__encode__iframe__'; // ระบุ iframe ของเป้าหมายที่ส่ง
document.body.appendChild (แบบฟอร์ม);
//ซ่อน iframe สกัดกั้นสตริงที่ส่งถ้า (!window['__encode__iframe__']) {
var iframe;
iframe = document.createElement('iframe');
iframe.setAttribute('ชื่อ', '__encode__iframe__');
iframe.style.display = 'ไม่มี';
iframe.width = "0";
iframe.height = "0";
iframe.scrolling = "ไม่";
iframe.allowtransparency = "จริง";
iframe.frameborder = "0";
iframe.src = 'about:blank'; // ตั้งค่าเป็นเปล่า document.body.appendChild(iframe);
-
-
window.__encode__iframe__callback__ = ฟังก์ชั่น (str) {
โทรกลับ (str);
ถ้า (document.all) {
document.charset = window.oldCharset;
-
-
//ตั้งค่าที่อยู่ของหน้าการเข้ารหัสการติดต่อกลับ ซึ่งต้องการให้ผู้ใช้แก้ไข form.action = window.location.href;
แบบฟอร์ม.ส่ง();
setTimeout (ฟังก์ชัน () {
form.parentNode.removeChild (แบบฟอร์ม);
iframe.parentNode.removeChild(iframe);
}, 1,000) // ลบโหนดหลังจาก 0.5 วินาที}
GBKEncode('อักขระที่ต้องเข้ารหัส', 'gb2312', โทรกลับ);//Test//Promise encapsulation var encode = function encode(str) {
var charset = arguments.length > 1 && arguments[1] !== undefinition ? arguments[1] : 'gbk';
คืนสัญญาใหม่ (ฟังก์ชั่น (แก้ไข, ปฏิเสธ) {
พยายาม {
_encode(str, ชุดอักขระ, ฟังก์ชัน (ข้อมูล) {
แก้ไข (ข้อมูล);
-
} จับ (e) {
แก้ไข ('ข้อผิดพลาดในการเข้ารหัสอักขระ', e.toString());
-
-
-2. ถอดรหัส (รองรับ GBK, GB2312, Base64)
ฟังก์ชั่น RandomId() {
ข้อความ var = "";
var เป็นไปได้ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
สำหรับ (var i = 0; i < 5; i++) {
ข้อความ += possible.charAt(Math.floor(Math.random() * possible.length));
} ส่งคืนข้อความ;
-
ฟังก์ชั่น _decode (str, ชุดอักขระ, โทรกลับ) {
สคริปต์ var = document.createElement('script');
var id = RandomId(); // สร้าง ID ที่ไม่ซ้ำกันเพื่อป้องกันความขัดแย้ง script.id = '_urlDecodeFn_' + id;
window['_urlDecodeFn_' + id] = โทรกลับ;
var src = 'data:text/javascript;charset=' + ชุดอักขระ + (',_urlDecodeFn_' + id + '("') + str + '");';
src += 'document.getElementById("_urlDecodeFn_' + id + '").parentNode.removeChild(document.getElementById("_urlDecodeFn_' + id + '"));';
script.src = src;
document.body.appendChild (สคริปต์);
-
_decode('อักขระที่จะถอดรหัส', 'gb2312', โทรกลับ) // ทดสอบ // สัญญาการห่อหุ้ม var decode = ฟังก์ชั่นถอดรหัส (str) {
var charset = arguments.length > 1 && arguments[1] !== undefinition ? arguments[1] : 'gbk';
คืนสัญญาใหม่ (ฟังก์ชั่น (แก้ไข, ปฏิเสธ) {
พยายาม {
_decode(str, ชุดอักขระ, ฟังก์ชัน (ข้อมูล) {
แก้ไข (ข้อมูล);
-
} จับ (e) {
แก้ไข ('ข้อผิดพลาดในการถอดรหัสอักขระ', e.toString());
-
-
-ลิงก์อ้างอิง: https://zhuanlan.zhihu.com/p/35537480
สรุปบทความนี้เกี่ยวกับการใช้งานส่วนหน้าของการเข้ารหัสและถอดรหัสสตริง GBK และ GB2312 (สรุป) สำหรับเนื้อหาการเข้ารหัสและถอดรหัสสตริง GBK และ GB2312 ที่เกี่ยวข้องเพิ่มเติม โปรดค้นหาบทความก่อนหน้าใน downcodes.com หรือเรียกดูบทความที่เกี่ยวข้องต่อด้านล่าง หวังว่าคุณจะสนับสนุน downcodes.com มากขึ้นในอนาคต!