【问题标题】:urlencoding form data with windows-1252 charset in node.js在 node.js 中使用 windows-1252 字符集对表单数据进行 urlencoding
【发布时间】:2016-08-12 00:24:10
【问题描述】:

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

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

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

【问题讨论】:

  • 现代网络服务器无法处理 UTF-8 编码的 URL。你确定这个要求吗?
  • 是的,我确定。我在我的 OP 中提到我设法用 java 客户端发送我的请求。当我在该 java 客户端中设置 utf8 时,服务器无法解码回正确的数据。此外,服务器响应发送的 html 页面设置为使用 windows-1252 字符集。
  • 出于好奇,服务器是什么?
  • 无法告诉您主机名。但在 chrome 的开发人员工具中,我看到了 IIS 7.5。可以通过查看 url 来判断它是一个 ASP.NET 服务器,即它们以 .asp 结尾。
  • 此服务器肯定处理 UTF-8 编码的 URL。错误必须是别的东西。你能发布一些有效的网址和一些无效的网址吗?

标签: node.js forms url-encoding


【解决方案1】:

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

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

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

注意事项:

  • 传统的 HTTP POST 是 URL 编码的,我们将为此使用 qs
  • qs-iconv 将提供对 UTF-8 以外的编码的支持,如 qs - Dealing with special character sets 中所述。
  • 如果您将数据作为字符串或普通对象传递,Restler 通常会将数据编码为 UTF-8,但如果您传递 Buffer,Restler 将按原样发送。
  • 设置正确的Content-TypeContent-Length 将确保数据可以在接收端正确解释。由于我们在这里提供自己的数据,因此我们需要手动设置这些标头。
  • 请注意,任何未包含在目标字符集中的字符(本例中为 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);
});

【讨论】:

  • 非常感谢您的回答。 qs-iconv 对我有用。我在请求实现中使用了您的编码代码,服务器按预期接受了 urlencoded 数据。
  • 针对同一问题的任何解决方案,但使用 multipart/form-data(包含文件)?
  • 我看不出这有什么不同。请求的内容类型和编码没有任何关系。这就像问“针对同一问题的任何解决方案,但使用 text/plain?”
猜你喜欢
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2013-03-22
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多