在 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-Type
和Content-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);
});
我需要 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-Type
和Content-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);
});