Я разрабатываю плагин 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.
Есть ли выход из этого?