问题的简短版本:在我的Node.js应用程序中使用Sails.js框架,我想将数据(简单的UTF-8文本字符集)发送到远程服务器POST表单,其中包含ISO-8859-15字符集。
详细信息:使用request包,表单以这种方式提交:
var postFields = {
'message' : message, // <== this var contains chars such as é,à,ç, etc.
'submit' : 'Send'
};
var opts = {
uri: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0',
'Cookie' : cookie,
'Content-type': "application/x-www-form-urlencoded; charset=ISO-8859-15"
},
form: postFields
};
request.post(opts, function(error, response, body) {
if (!error && response.statusCode == 200) {
return callback(null, true);
} else {
return callback(null, false);
}
});
这很好用,我的表单发送成功,除了“é”字符变成丑陋的“é”到遥远的服务器。在opts对象的'Content-type'属性中,我尝试将charset设置为ISO-8859-15 / UTF-8 / none,text / html或application / x-www-form-urlencoded,仍然不起作用...
不知道这是否有帮助,但这是我必须做的事情:
1)从远程服务器获取数据(latin1编码),然后将其转换为UTF-8文本:
var iconv = require('iconv-lite');
request(options, function(error, response, body) {
var decodedBody = iconv.decode(body, 'iso-8859-15');
return callback(null, decodedBody)
}
});
太好了,现在我有很棒的口音。
2)更新此数据,然后使用上面的第一个代码块将其发送回远程服务器。
实际上我以前用PHP做了完全相同的操作,工作正常:它不是发送“原始”UTF-8文本消息(postFields对象),而是传递给utf8_decode()函数并显示远程服务器正确的重音。 我尝试了js implementation这个函数=&gt;重音被正确发送,但这次所有其他正常的字符变得怪异......
希望这很清楚,如果您需要更多细节,代码或实际示例:没问题!感谢您阅读:)
答案 0 :(得分:0)
好吧,在3年零10个月后,我遇到了类似的问题,但是我设法找到了解决方案!
要解决此问题,您需要使用urlencode和body
而不是form
,如下所示:
const urlencode = require('urlencode');
const request = require('request');
const fields = {
message: 'é à ç'
};
const opts = {
uri: 'https://localhost',
headers: {
'Content-type': 'application/x-www-form-urlencoded; charset=ISO-8859-1'
},
body: urlencode.stringify(fields, {
charset: 'latin1'
})
};
request.post(opts, (err, res, body) => {
if (err) {
throw err;
}
console.log(res.statusCode);
});
这是因为request
使用 UTF-8 对表单字段进行编码,因此即使您之前对它们进行编码,也永远不会得到 Latin-1 个字符(以重新编码的字符结尾)。
我已经对此进行了测试,并且可以按预期工作,因此希望对其他人有所帮助!