【问题标题】:Submit POST form with latin1 charset in Node.js在 Node.js 中提交带有 latin1 字符集的 POST 表单
【发布时间】:2018-10-20 01:02:34
【问题描述】:

问题的简短版本:在我使用 Sails.js 框架的 Node.js 应用程序中,我想将数据(简单的 UTF-8 文本字符集)发送到具有 ISO-8859-15 的远程服务器 POST 表单字符集。

详情:使用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 => 正确发送了重音符号,但这次所有其他正常字符都变得很奇怪......

希望这足够清楚,如果您需要更多详细信息、代码或实际示例:没问题!感谢阅读:)

【问题讨论】:

  • 我不确定它是否有效。但比起用formdata发送数据,我更喜欢在options中用json发送测试数据。
  • 感谢您的回答,但我无法使用您的提示解决问题...同时,我作弊了一点:现在不是直接将数据发送到远程服务器(a Fluxbb 论坛),Node.js 应用程序将其发送到我的 apache 文件夹上的 PHP 脚本,该脚本在发布到论坛之前 php_decode() 字符串,就像我在切换到 Node.js 之前所做的那样。也许它不是很干净,但这很有效!多亏了 javascript async 的东西,它的执行时间并不长:P 无论如何,如果有人有完整的 js 解决方案,我很乐意阅读它;)

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


【解决方案1】:

好吧,在 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 字符(您最终会带有重新编码的字符)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2013-02-23
    • 2012-01-27
    • 2013-05-19
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多