Предисловие
Сложная проблема, с которой я столкнулся при разработке проекта, заключалась в том, что продукт требует, чтобы поисковые запросы в адресной строке браузера были получены из браузера для оценки. Обычно мы используем формат кодировки 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 и дальше!