node+iconv-lite无法转换qq昵称api的用户名信息字符编码.[已解决]

  • - api: https://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=qq号

返回数据:

图片说明

网页显示:

图片说明

网页显示的内容是chorme浏览器自动转成GBK的.

使用node+http-proxy-middleware+iconv-lite进行跨域调用和转码:

代码:

router.get('/qqinfo', createProxyMiddleware({
  changeOrigin: true,
  // selfHandleResponse: true,
  target: 'https://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg',
  pathRewrite: { '^/api/out/qqinfo': '' },
  onProxyReq(proxyReq, req, res) {
    proxyReq.setHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9');
    proxyReq.setHeader('Cache-Control', 'no-cache');
    proxyReq.setHeader('Accept-Language', 'zh-CN,zh;q=0.8;en-US;q=0.9');
    proxyReq.setHeader('sec-fetch-site', 'none');
    proxyReq.setHeader('referer', '');
    proxyReq.setHeader('sec-fetch-mode', 'navigate');
    proxyReq.setHeader('sec-fetch-user', '?1');
    proxyReq.setHeader('Host', 'r.qzone.qq.com');
    proxyReq.setHeader('sec-fetch-dest', 'document');
    proxyReq.setHeader('Upgrade-Insecure-Requests', '1');
  },
  onProxyRes(proxyRes, req, res) {
    let arr = [];
    proxyRes.on('data', (chunk) => {
      arr.push(chunk)
    })
    proxyRes.on('end', () => {
      arr = Buffer.concat(arr)
      console.log(arr) //buffer
            let str1 = iconv.decode(arr, 'utf-8')//乱码
      let str2 = iconv.decode(arr, 'GBK') //通过node转换gbk
            console.log(str1) //乱码
            console.log(str2) //乱码
          res.end(str)//乱码,注释直接返回代理请求结果正常显示.
    })
  },
}))

图片说明

不经过node转码直接返回(浏览器GBK编码):

图片说明

参考GPT和自己的思路:

根据你的描述,问题出现在调用 API 返回的数据中,因为其中包含了一些非 ASCII 字符,需要进行编码转换才能正常显示。你使用了 Node.js 和 iconv-lite 组件来实现编码转换,但是遇到了编码转换失败的问题。具体原因可能是使用了错误的编码格式或者在转换过程中出现了一些异常情况。建议你尝试使用其他编码格式进行转换,或者检查代码中是否存在错误,例如数据流处理不完整等问题,以找到编码转换失败的原因。