2

Я разрабатываю плагин greasemonkey, который должен отправить форму в фоновом режиме с помощью POST (GM_xmlhttpRequest) в приложении, не находящемся под моим контролем. Это приложение написано на PHP и, похоже, ожидает его ввода в кодировке Windows-1250. Мне нужно сделать все поля формы, как они есть, отредактировать только один из них и повторно отправить. В некоторых из полей используются символы с акцентом и ограничены по длине.Связь Greasemonkey с сервером, для которого требуется кодировка windows-1250

Не проблема в теории - я повторяю все поля формы, использую функцию encodeURIComponent для значений и объединяю все в тело запроса сообщения. ОДНАКО. Функция encodeURIComponent всегда кодирует символы в соответствии с UTF-8, что приводит ко всем видам проблем. Поскольку PHP, похоже, не перекодирует мой запрос на Windows-1250 должным образом, он неправильно интерпретирует многобайтовые строки и приходит к выводу, что повторно представленные значения длиннее допустимых 40 символов и умирают от меня. Или сценарий просто умирает молча, не давая мне никакой полезной обратной связи.

Я протестировал это, посмотрев на объект POST, который отправляет Firefox, когда я отправляю форму в окне браузера, а затем повторно отправляет те же данные на сервер с помощью xhr. Это сработало. Например, строка:

Zajišťujeme profesionální modelky

выглядит следующим образом, когда кодируется encodeURIComponent:

Zaji%C5%A1%C5%A5ujeme%20profesion%C3%A1ln%C3%AD%20modelky

То же самое с помощью UrlEncode в PHP (исходный текст в Windows-1250) или Firefox:

Zaji%9A%9Dujeme+profesion%E1ln%ED+modelky

По-видимому, мне нужно кодировать как будто это было в windows-1250 или каким-то образом заставить сервер принять utf-8 (что, я сомневаюсь, возможно). Я пробовал все виды других функций, таких как escape или encodeURI, но результат не сильно отличается - все, кажется, выводятся в utf-8.

Есть ли выход из этого?

+0

Я сам думаю, что единственный способ - это перекодировка на сервере, urlencode и отправка обратно на клиентский скрипт для отправки на внешний веб-сайт. Я бы хотел, чтобы меня оправдали. – VoY

ответ

2

Другой способ заставить Firefox кодировать URL-адрес - установить его как ссылку на ссылку href. Свойство (атрибут NOT) всегда будет считаться абсолютной ссылкой urlencoded в кодировке страницы.

Для запроса GET вы просто установите href как http://server/cgi?var=value и зачитаете закодированную форму. Для запроса POST вам нужно будет сделать дополнительный шаг для разделения данных (вы не можете использовать ?var=value самостоятельно, потому что ссылка читается как абсолютная ссылка).

+0

Эй, это умно! –

+0

Это отличная идея, спасибо! – VoY

1

Позвольте браузеру закодировать форму. Поместите его в скрытый iframe и вызовите submit() на нем.

+0

Если я это сделаю, смогу ли я получить уведомление, когда представление закончится? – VoY

+0

Страница, возвращаемая при отправке, должна уведомить вас. –

 Смежные вопросы

  • Нет связанных вопросов^_^