在 node.js 中使用 windows-1252 字符集对表单数据进行 urlencoding

urlencoding form data with windows-1252 charset in node.js

我需要 post 一个已设置为使用 windows-1252 字符集对其数据进行 urlencoding 的表单。对于简单字符,默认编码 (utf8) 有效,但特殊字符必须使用所需的字符集进行编码。

我使用的 npm "request" 包不允许设置任何特定的字符集,默认情况下使用 utf8。我尝试了另一个包 "Restler",它允许设置编码,但是当我指定 windows-1252 时它抛出异常说无效字符集(Node 只提供少数编码字符集(缓冲区 class) windows-1252 不是其中之一)。

请告诉我我想要实现的目标在节点中是否可行?出于验证目的,我在 java 中创建了一个小客户端,并使用了具有 windows-1252 编码的 apache 的 http 客户端库,我的请求已被服务器成功接受。到目前为止,我还无法在节点中解决这个问题。

在节点中以 Windows-1252 等传统编码发送 HTTP 请求数据并不简单,因为这些编码没有本机支持。

可以以 iconv 库的形式添加支持,所以它绝对可行,即使它不是开箱即用的。

以下目标 restler,因为您正在使用它,但原则上这适用于任何客户端 HTTP 库。

备注:

  • 传统的 HTTP POST 是 URL-encoded,我们将为此使用 qs
  • qs-iconv, as documented in qs - Dealing with special character sets 将提供对 UTF-8 以外编码的支持。
  • 如果您将数据作为字符串或纯格式传递,Restler 通常会将数据编码为 UTF-8 object,但如果您传递 Buffer,Restler 将按原样发送。
  • 设置适当的Content-TypeContent-Length将确保接收端可以正确解释数据。由于我们在这里提供了自己的数据,因此我们需要手动设置这些 headers。
  • 请注意,任何未包含在目标字符集中的字符(在本例中为 Windows-1252) 编码为 ? iconv(URL形式的%3F)因此将丢失。

代码:

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);
});