在nodejs上的post请求中设置charset

时间:2015-12-12 14:30:14

标签: node.js character-encoding request

我想通过请求模块使用euc-kr charset将帖子表单数据发送到某个网站。我也使用iconv-lite模块,因为nodejs支持的字符集并不充足。

无论如何,网站使用euc-kr字符集,所以我必须处理表单数据的编码(Node的默认字符集是utf-8)。但它不能很好地工作,我试图改变一些选项,但我现在一直坚持,所以你能告诉我一些提示吗?

// added module request, iconv-lite(extendNodeEncoding) already.

function postDocumentForm() {
//Lets configure and request
    request({
        url: 'http://finance.naver.com/item/board_act.nhn', //URL to hit
        headers: { 
            'Content-Type': 'content=text/html; charset=euc-kr'
        },
        method: 'POST',
        encoding: 'euc-kr',
        form: {
            code:'000215',
            mode: 'write',
            temp: '',
            keyCount: '0',
            title: "폼 데이터 중 일부가 한글일 때",
            opinion: '0',
            body:'인코딩이 제대로 되지 않고 있음!'
        }
    }, function (error, response, body) {
        if (error) {
            console.log(error);
        } else {
            iconv.undoExtendNodeEncodings();
            console.log(response.statusCode, response.body);


        }
    });

}

这是结果,奇数字符。

我试过了:

euc-kr to binary 
euc-kr to null 
euc-kr to utf-8
delete encoding option 
delete request header 

result is ????@?@@?

3 个答案:

答案 0 :(得分:1)

最后我得到了灵魂,我解决了这个问题。

如果使用请求模块将数据作为表单发送,则模块会强制将表单编码更改为utf-8。因此,即使您将表单编码设置为另一个字符集,模块也会再次将您的字符集更改为utf8。您可以在1120-1130行的request.js上看到。

所以,你最好通过'body'选项发送数据,而不是'form'选项。 (作为查询字符串)

 docker run -d --name web_lb -p 8000:80 --link web_1:web_1 --link web_2:web_2 tutum/haproxy

答案 1 :(得分:0)

注意它如何处理接收身体编码

iconv  = require('iconv-lite');

function postDocumentForm() {
//Lets configure and request
    request({
        url: 'http://finance.naver.com/item/board_act.nhn', //URL to hit
        headers: { 
            'Content-Type': 'content=text/html; charset=euc-kr'
        },
        method: 'POST',
        encoding: null,
        form: {
            code:'000215',
            mode: 'write',
            temp: '',
            keyCount: '0',
            title: "폼 데이터 중 일부가 한글일 때",
            opinion: '0',
            body:'인코딩이 제대로 되지 않고 있음!'
        }
    }, function (error, response, body) {
        if (error) {
            console.log(error);
        } else {
            console.log(response.statusCode);
            var utf8String = iconv.decode(new Buffer(body), "ISO-8859-1");
            console.log(utf8String);
        }
    });
}

答案 2 :(得分:0)

在阅读了几个小时的源代码之后,我终于找到了简单的解决方案。

首先,编写你的编码函数,它输入一个字符串并输出一个编码的字符串:

const urlencode = require('urlencode');
function encoder(s){
    return urlencode(s, 'gb2312');
}

这是一个基于urlencode

的中文编码器

然后在发布时添加qsStringifyOptions选项:

request({
    url: 'http://finance.naver.com/item/board_act.nhn', //URL to hit
    headers: { 
        'Content-Type': 'content=text/html; charset=euc-kr'
    },
    method: 'POST',
    encoding: null,
    form: {
        code:'000215',
        mode: 'write',
        temp: '',
        keyCount: '0',
        title: "폼 데이터 중 일부가 한글일 때",
        opinion: '0',
        body:'인코딩이 제대로 되지 않고 있음!'
    },
    qsStringifyOptions: {
        encoder: encoder
    }
});