【已解决】问一个有关于GB2312的问题
发布于 4个月前 作者 backsapce 361 次浏览 来自 问答

#####-----------------------------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()

依然没有得到正确响应

@backsapce

var buf = "TXTXH=1105020215&CmdFind=" + encodeURIComponent("查 询(Q)")

@backsapce

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'});

也能达到同样的效果

回到顶部