【已解决】问一个有关于GB2312的问题
#####-----------------------------vvvv解决方案在最下方
我在做我们学校教务网爬虫的时候,遇到了一个奇葩无比的问题。 在一个post请求中,有两个参数。 第一个是学号,第二个参数是"%B2%E9+%D1%AF%28Q%29" 这样的一个东西,好吧,这货经过gb2312转码之后 就是“查 询(Q)”这句话。真是坑爹啊,居然还用中文作为post请求的识别符。 请教一下怎么才能构建这种post请求呢?
var req = http.request(options, function (res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
})
buf='TXTXH=1105020215&CmdFind=查 询(Q)'
req.write(buf)
req.end();
这里面的buf怎么构建才正确呢?
###----------update------------ 结合各位大神的回复,给个例子记录一下吧 ####post请求中form数据gb2312编码(或者其他的非utf)
var urlencode = require('urlencode2');
var data = {
//something
}
var buf = urlencode.stringify(data, {charset: 'gb2312'});
var options = {
hostname: 'hostname',
port: 80,
path: '/yourpath',
method: 'POST or GET',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': buf.length //这个是万万不能没有啊,否则post就不正确了,具体原因不明
}
};
var req = http.request(options, function (res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
})
//错误处理
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.write(buf)
req.end();
6 回复
encodeURIComponent(“查 询(Q)”) === “%E6%9F%A5%20%E8%AF%A2(Q)”
@151263 事实上
buf = encodeURIComponent("TXTXH=1105020215&CmdFind=查 询(Q)");
console.log('BUF ' + buf)
req.write(buf)
req.end()
依然没有得到正确响应
var buf = "TXTXH=1105020215&CmdFind=" + encodeURIComponent("查 询(Q)")
var urlencode = require('urlencode2');
var obj = {
TXTXH: 1105020215,
CmdFind: '查 询(Q)',
};
var buf = urlencode.stringify(obj, {charset: 'gb2312'});
console.log(buf); // => TXTXH=1105020215&CmdFind=%B2%E9%20%D1%AF%28%51%29
@alsotang 赞,解决了,还有注意的是如果没有设置请求头的长度的话依然得不到正确结果
var options = {
hostname: 'cwc.hnust.cn',
port: 80,
path: 'xxx',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length //不设置长度的话得不到结果,具体原因不明
}
};
用@alsotang的module很方便,
var buf = urlencode.stringify(obj, {charset: 'gb2312'});
也能达到同样的效果
图尔特特