Nodejs request 请求到的数据为乱码,求解决

Nodejs request 请求到的数据为乱码,求解决

这个链接请求的数据结果乱码,求解决

http://zhuanlan.zhihu.com/api/columns/bigertech/posts/19885746

在浏览器中打开是正确的,自己使用 request 模块,请求到的数据就是乱码, 不知道用的什么编码格式编码的 , 跪求指导怎么解码?

var request = require('request');
request('http://zhuanlan.zhihu.com/api/columns/bigertech/posts/19885746', function (req,res,body) {
    console.log(body);
});

12 回复

当然可以。根据你的描述,你遇到的问题可能是由于字符编码不正确导致的。在 Node.js 中使用 request 模块请求数据时,需要确保正确处理响应的字符编码。以下是一个示例代码,展示了如何正确处理编码问题:

const request = require('request');

request({
    url: 'http://zhuanlan.zhihu.com/api/columns/bigertech/posts/19885746',
    encoding: null // 将编码设置为 null,以确保返回二进制数据
}, (err, res, body) => {
    if (err) {
        console.error('请求失败:', err);
        return;
    }

    // 检查响应头中的 Content-Type,并获取字符编码
    const contentType = res.headers['content-type'] || '';
    const charsetMatch = contentType.match(/charset=([\w-]+)/i);
    let charset = charsetMatch ? charsetMatch[1] : 'utf-8'; // 默认使用 utf-8 编码

    // 将二进制数据转换为字符串
    const decodedBody = body.toString(charset);

    console.log(decodedBody);
});

解释

  1. encoding: null: 这个选项告诉 request 模块不要自动将响应体解码为字符串,而是将其作为二进制数据返回。
  2. 检查响应头中的 Content-Type: 通过解析响应头中的 Content-Type 字段,我们可以找到字符编码信息。
  3. 将二进制数据转换为字符串: 使用 toString 方法并指定正确的字符编码来解码二进制数据。

通过这种方式,你可以确保正确地处理从服务器接收到的数据,并避免乱码问题。希望这能帮助你解决问题!


设置gzip为true

var request = require('request');
request({url:'http://zhuanlan.zhihu.com/api/columns/bigertech/posts/19885746',gzip:true}, function (err,response,body) {
        console.log(body);
});

还是我来回答把,楼上的我用了是不行的! 以后回答,请先自己测试

下面测试过可用:只是我换成了superagent

var request = require('superagent');
request
.get('http://zhuanlan.zhihu.com/api/columns/bigertech/posts/19885746')
.end(function(res){
    console.log(res.body);
});

你可以把http的header打印出来看看返回的数据有没有经过gzip压缩,如果有压缩的话我得先解压缩。然后查看一下返回数据的编码, 在浏览器里直接访问返回数据好像是unicode编码,所以在接收到数据后最好使用birnary来接收,使用iconv转成utf8编码

我也碰到过这种情况,取出来的内容是乱码。乱码的原因的话编码问题造成的,有的网页是utf-8,有的是gb2312。 我处理这个问题思路是这样的:把希望取出来的内容通过buffer = new Buffer(content)存进去,了解网页的编码模式, 然后用iconv-lite进行decode转码 可以试一下~~

找到原因之后。通过 urlencode2iconv-lite 肯定能解决乱码问题。

看这里争论的这么开心,最后楼主跑出来说,其实我想问的是学习挖掘技术哪家强?:D

看了诸位道友的回答受益颇多,自己也动手尝试并总结了下: 1 request中如果不手动设置gzip的话显示的的确是乱码,加gzip参数后显示的便是unicode,想要看中文的话还是需要用json去parse下的。 2 superagent自带parseJson方法,内部做过处理。 3 我装的chrome是原版无插件的,浏览器看出来的就是unicode代码。诚如楼主所说能看到中文是装过json自动转换工具的。 4 我是路过度劫的~~

乱码解决 主要是为了这个 模块的, zhihu_module

这个问题其实是因为使用了accept-encoding请求头 requset header: accept-encoding: gzip, deflate, br,浏览器告诉服务器支持的编码方式有gzip, deflate, br这三种 response header: content-encoding: br,服务器告诉浏览器用了 br 这种方式编码 然而request配置中加上gzip: true 只能解析gzip编码的,遇到谷歌首页优先使用br编码一样会乱码 所以最好的解决办法是在请求头中把 accept-encoding 去掉,这样返回内容就不会经过编码。

赞 11月16日

根据你的描述,问题可能出在返回数据的编码格式上。通常情况下,HTTP 响应会包含 Content-Type 头信息,指示响应体的数据编码格式。你可以通过检查响应头来确定正确的编码方式。

以下是如何使用 request 模块正确处理响应体的示例代码:

const request = require('request');

request({
  url: 'http://zhuanlan.zhihu.com/api/columns/bigertech/posts/19885746',
  encoding: null // 不要自动解析响应体
}, function(error, response, body) {
  if (!error && response.statusCode === 200) {
    const contentType = response.headers['content-type'];
    let decodedBody;

    // 解析 Content-Type 头信息,判断编码格式
    if (contentType.includes('charset=UTF-8')) {
      decodedBody = body.toString('utf8'); // 使用 UTF-8 编码
    } else {
      // 根据实际情况处理其他编码格式
      console.error('Unsupported charset:', contentType);
    }

    console.log(decodedBody);
  }
});

在这个示例中,我们首先禁用了 request 模块的自动编码转换 (encoding: null)。然后我们从响应头中获取 Content-Type 并解析其字符集(charset),以确定响应体的实际编码格式。最后,我们将响应体转换为正确的字符串格式并打印出来。

如果发现某些网站返回的数据并非 UTF-8 编码,你可能需要根据 Content-Type 头信息中的具体编码来调整 body.toString() 方法的参数。

回到顶部