Предисловие
Сложная проблема, с которой я столкнулся при разработке проекта, заключалась в том, что продукт требует, чтобы поисковые запросы в адресной строке браузера были получены из браузера для оценки. Обычно мы используем формат кодировки 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, обратный вызов) { //Создаем форму и кодируем через Accept-charset var form = document.createElement('form'); форма.метод = 'получить'; form.style.display = 'нет'; form.acceptCharset = кодировка; если (документ.все) { //Если это IE, то вызываем метод document.charset window.oldCharset = document.charset; document.charset = кодировка; } var input = document.createElement('input'); input.type = 'скрытый'; input.name = 'str'; input.value = ул; form.appendChild(вход); form.target = '__encode__iframe__' // Укажите iframe отправленной цели document.body.appendChild(форма); //Скрыть отправленную строку, перехваченную iframe if (!window['__encode__iframe__']) { вар iframe; iframe = document.createElement('iframe'); iframe.setAttribute('name', '__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__ = function (str) { обратный вызов (стр); если (документ.все) { document.charset = window.oldCharset; } } //Устанавливаем адрес страницы кодирования обратного вызова, которая требует от пользователя изменения form.action = window.location.href; форма.submit(); setTimeout(функция () { form.parentNode.removeChild(форма); iframe.parentNode.removeChild(iframe); }, 1000) //Удалить узел через 0,5 секунды} GBKEncode('Символы, которые необходимо закодировать', 'gb2312', обратный вызов);//Тест //Инкапсуляция обещаний var encode = function encode(str) { var charset = аргументы.длина > 1 && аргументы[1] !== не определено ? аргументы[1] : 'gbk'; вернуть новое обещание (функция (разрешить, отклонить) { пытаться { _encode(str, кодировка, функция (данные) { разрешить (данные); }); } поймать (е) { solve('Ошибка кодировки символов.', e.toString()); } }); };
2. Декодирование (поддерживает GBK, GB2312, Base64)
функция случайныйИд() { вар текст = ""; var возможно = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; для (вар я = 0; я <5; я++) { текст += возможно.charAt(Math.floor(Math.random() * возможно.длина)); } возвращаемый текст; } функция _decode(str, charset, обратный вызов) { var script = document.createElement('script'); var id = randomId(); // Генерируем уникальный идентификатор для предотвращения конфликтов script.id = '_urlDecodeFn_' + id; окно ['_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 = источник; document.body.appendChild(скрипт); } _decode('Символ для декодирования', 'gb2312', обратный вызов) // Тест // инкапсуляция обещаний var decode = function decode(str) { var charset = аргументы.длина > 1 && аргументы[1] !== не определено ? аргументы[1] : 'gbk'; вернуть новое обещание (функция (разрешить, отклонить) { пытаться { _decode(str, кодировка, функция (данные) { разрешить (данные); }); } поймать (е) { solve('Ошибка декодирования символов.', e.toString()); } }); };
Ссылка на ссылку: https://zhuanlan.zhihu.com/p/35537480
На этом завершается статья о внешней реализации кодирования и декодирования строк GBK и GB2312 (сводка). Дополнительные сведения о кодировании и декодировании строк GBK и GB2312 можно найти в предыдущих статьях на сайте downcodes.com или продолжить просмотр статей по теме ниже. Надеюсь, вы будете поддерживать downcodes.com и дальше!