Greasemonkey связь с сервером, который требует кодировки Windows-1250 - PullRequest
2 голосов
/ 04 декабря 2009

Я разрабатываю плагин greasemonkey , который должен отправлять форму в фоновом режиме, используя POST (GM_xmlhttpRequest) для приложения, которое не находится под моим контролем. Это приложение написано на PHP и, похоже, ожидает ввода в кодировке 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.

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

Ответы [ 2 ]

2 голосов
/ 05 декабря 2009

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

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

1 голос
/ 04 декабря 2009

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

...