在Node.js中使用latin1 charset提交POST表单

时间:2014-11-28 13:19:53

标签: node.js character-encoding request sails.js

问题的简短版本:在我的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;重音被正确发送,但这次所有其他正常的字符变得怪异......

希望这很清楚,如果您需要更多细节,代码或实际示例:没问题!感谢您阅读:)

1 个答案:

答案 0 :(得分:0)

好吧,在3年零10个月后,我遇到了类似的问题,但是我设法找到了解决方案!

要解决此问题,您需要使用urlencodebody而不是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 个字符(以重新编码的字符结尾)。

我已经对此进行了测试,并且可以按预期工作,因此希望对其他人有所帮助!