【发布时间】: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