urlencoding данные формы с кодировкой windows-1252 в node.js

Мне нужно опубликовать форму, которая настроена на использование кодировки Windows-1252 для URL-кодирования ее данных. для простых символов работает кодировка по умолчанию (utf8), но специальные символы должны быть закодированы с помощью требуемой кодировки.

Пакет npm «request», который я использую, не позволяет устанавливать какую-либо конкретную кодировку и по умолчанию использует utf8. я попробовал другой пакет «Restler», который позволяет устанавливать кодировку, но выдает исключение, говорящее о недопустимой кодировке, когда я указываю windows-1252 (Node предлагает только несколько кодировок кодировок (класс Buffer), а windows-1252 не является одним из них) .

пожалуйста, дайте мне знать, возможно ли то, чего я пытаюсь достичь, в узле или нет? в целях проверки я создал небольшой клиент на java и использовал клиентскую библиотеку apache http с кодировкой windows-1252, и мой запрос был успешно принят сервером. до сих пор я не смог понять это в узле.


person h.i    schedule 11.08.2016    source источник
comment
Ни один современный веб-сервер не может работать с URL-адресами в кодировке UTF-8. Вы уверены в этом требовании?   -  person Tomalak    schedule 11.08.2016
comment
Да, я уверен. я упоминаю в своем ОП, что мне удалось отправить свой запрос с помощью java-клиента. когда я устанавливаю utf8 в этом java-клиенте, серверу не удается декодировать обратно правильные данные. Кроме того, html-страница, которую сервер отправляет в ответ, настроена на использование кодировки Windows-1252.   -  person h.i    schedule 11.08.2016
comment
Из любопытства, что за сервер?   -  person Tomalak    schedule 11.08.2016
comment
не могу сказать вам имя хоста. но в инструментах разработчика Chrome я увидел IIS 7.5. можно сказать, что это сервер ASP.NET, посмотрев на URL-адреса, т.е. они заканчиваются на .asp.   -  person h.i    schedule 11.08.2016
comment
Этот сервер определенно обрабатывает URL-адреса в кодировке UTF-8. Ошибка должна быть в чем-то другом. Можете ли вы опубликовать URL-адреса, которые работают, а некоторые нет?   -  person Tomalak    schedule 11.08.2016
comment
точнее, это данные формы, а не URL-адрес. Я объясню это с помощью символа, который на данный момент вызывает проблему, ‘ (код ascii 8216). с windows-1252 это кодирует %91. а с utf8 кодируется как %E2%80%98. сервер принимает данные только тогда, когда символ закодирован в %91. что возможно только с windows-1252.   -  person h.i    schedule 11.08.2016
comment
Давайте продолжим обсуждение в чате.   -  person Tomalak    schedule 11.08.2016
comment
Есть еще отзывы?   -  person Tomalak    schedule 12.08.2016


Ответы (1)


Отправка данных HTTP-запроса в устаревшей кодировке, такой как Windows-1252, не является простой задачей в узле, поскольку для этих кодировок нет встроенной поддержки.

Поддержка может быть добавлена ​​в виде библиотеки iconv, так что это определенно выполнимо, даже если это не работает из коробки.

Следующее предназначено для restler, потому что вы его используете, но в принципе это относится к любой клиентской библиотеке HTTP.

Примечания:

  • Традиционные HTTP-запросы POST имеют URL-кодирование, для этого мы будем использовать qs.
  • Поддержка кодировок, отличных от UTF-8, будет обеспечиваться qs-iconv, как описано в qs — Работа со специальными наборами символов.
  • Restler обычно кодирует данные как UTF-8, если вы передаете их как строку или простой объект, но если вы передаете Buffer, Restler отправит их как есть.
  • Установка правильных Content-Type и Content-Length обеспечит правильную интерпретацию данных на принимающей стороне. Поскольку мы предоставляем здесь свои собственные данные, нам нужно установить эти заголовки вручную.
  • Имейте в виду, что любой символ, который не содержится в целевой кодировке (в данном случае Windows-1252), будет закодирован как ? с помощью iconv (%3F в форме URL) и, следовательно, будет потерян.

Код:

var rest = require('restler');
var qs = require('qs');
var win1252 = require('qs-iconv/encoder')('win1252');

var requestData = {
  key1: "‘value1‘",
  key2: "‘value2‘"
};

var requestBody = qs.stringify(requestData, { encoder: win1252 });
// => "key1=%91value1%91&key2=%91value2%91"

var requestBuf = new Buffer(requestBody);

rest.post('your/url', {
  data: requestBuf,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=windows-1252',
    'Content-Length': requestBuf.length
  }
}).on('complete', function(data) {
  console.log(data);
});
person Tomalak    schedule 11.08.2016
comment
Большое спасибо за ваш ответ. у меня сработала qs-icon. я использовал ваш код кодирования с реализацией моего запроса, и сервер принял данные в кодировке urlencoded, как и ожидалось. - person h.i; 13.08.2016
comment
любые решения для той же проблемы, но с multipart/form-data (содержит файлы)? - person Sebastien; 06.06.2017
comment
Я не вижу, как это имеет какое-то значение. Тип содержимого запроса и кодировка никак не связаны. Это все равно, что спрашивать какое-нибудь решение той же проблемы, но с text/plain? - person Tomalak; 06.06.2017