คำนำ
ปัญหาที่ค่อนข้างยุ่งยากที่ฉันพบเมื่อพัฒนาโครงการคือผลิตภัณฑ์ต้องการคำค้นหาในแถบที่อยู่ของเบราว์เซอร์เพื่อดึงข้อมูลจากเบราว์เซอร์เพื่อการตัดสิน โดยทั่วไปเราใช้รูปแบบการเข้ารหัส 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 มากขึ้นในอนาคต!