مقدمة
كانت المشكلة الصعبة التي واجهتها عند تطوير المشروع هي أن المنتج يتطلب استرداد مصطلحات البحث الموجودة في شريط عنوان المتصفح من المتصفح للحكم عليها. نستخدم بشكل عام تنسيق ترميز 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.cloud(); } وظيفة GBKEncode(str، مجموعة الأحرف، رد الاتصال) { // إنشاء نموذج وترميزه من خلال Accept-charset فار النموذج = document.createElement('form'); form.method = 'get'; form.style.display = 'none'; form.acceptCharset = charset; إذا (المستند.الكل) { // إذا كان IE، فاتصل بطريقة document.charset window.oldCharset = document.charset; document.charset = charset؛ } var input = document.createElement('input'); input.type = 'مخفي'; input.name = 'str'; input.value = str; form.appendChild(input); form.target = '__encode__iframe__'; // حدد إطار iframe للهدف المقدم document.body.appendChild(form); // إخفاء سلسلة iframe التي تم اعتراضها if (!window['__encode__iframe__']) { فار iframe؛ iframe = document.createElement('iframe'); iframe.setAttribute('name', '__encode__iframe__'); iframe.style.display = 'none'; iframe.width = "0"; iframe.height = "0"; iframe.scrolling = "no"; iframe.allowtransparency = "true"; iframe.frameborder = "0"; iframe.src = 'about:blank'; // اضبط على مساحة فارغة document.body.appendChild(iframe); } // window.__encode__iframe__callback__ = الوظيفة (str) { رد الاتصال (شارع)؛ إذا (المستند.الكل) { 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'، رد اتصال)؛//اختبار//تغليف الوعد var encode = function encode(str) { var charset = الوسيطات. الطول > 1 && الوسيطات[1] !== غير محددة الوسيطات[1] : 'gbk'; إرجاع وعد جديد (وظيفة (حل، رفض) { يحاول { _encode(str، مجموعة الأحرف، الوظيفة (البيانات) { حل(البيانات); }); } قبض (ه) { حل ("خطأ في ترميز الأحرف."، e.toString ())؛ } }); };
2. فك التشفير (يدعم GBK، GB2312، Base64)
وظيفة عشوائية () { نص فار = ""; var محتمل = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; لـ (var i = 0; i < 5; i++) { text += محتمل.charAt(Math.floor(Math.random() * محتمل.طول)); }إرجاع النص؛ } وظيفة _decode(str، مجموعة الأحرف، رد الاتصال) { var script = document.createElement('script'); var id = RandomId(); // أنشئ معرفًا فريدًا لمنع التعارضات 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 + '"));'; script.src = src; document.body.appendChild(script); } _decode('الحرف المراد فك ترميزه'، 'gb2312'، رد اتصال) // اختبار // تغليف الوعد var decode = function decode(str) { var charset = الوسيطات. الطول > 1 && الوسيطات[1] !== غير محددة الوسيطات[1] : 'gbk'; إرجاع وعد جديد (وظيفة (حل، رفض) { يحاول { _decode(str، مجموعة الأحرف، الوظيفة (البيانات) { حل(البيانات); }); } قبض (ه) { حل ("خطأ في فك تشفير الأحرف."، e.toString ())؛ } }); };
الرابط المرجعي: https://zhuanlan.zhihu.com/p/35537480
وبهذا تنتهي هذه المقالة حول تنفيذ الواجهة الأمامية لتشفير وفك تشفير السلسلة GBK وGB2312 (ملخص). لمزيد من محتوى تشفير وفك تشفير السلسلة GBK وGB2312، يرجى البحث في المقالات السابقة على downcodes.com أو متابعة التصفح أدناه نأمل أن تدعم downcodes.com أكثر في المستقبل!