Electron 下对 web 微信抓包 HTTP 请求结果有中文乱码,Nodejs 如何解决?

发布于 1周前 作者 ionicwang 来自 nodejs/Nestjs

Electron 下对 web 微信抓包 HTTP 请求结果有中文乱码,Nodejs 如何解决?

在逼乎和 stackoverflow 上都提问了,在这里继续寻找老司机。

用 Electron 把 web 微信包了一层,然后根据官方文档,使用 chrome-devtools 的 network 对 HTTP 请求进行抓包。但是在一个 POST 的 response 中,返回的是一个 JSON 字符串,里面的中文字段值是乱码。

根据 response 的 headers ,能看到服务端并未给出这次返回的 charset ,所以猜测 node 里是当做默认编码(Latin_1)解码的,所以造成了乱码。但理论上字符的二进制序列应该是对的,所以我用 Buffer 转了一次码

let content = new Buffer(e.Content, "binary").toString();

结果在有些情况下确实可以使用,但是有些字符不能准确转码。我直接打印了 Buffer 的内容,看字符的 16 进制内容。结果发现有的汉字编码并不对,比如:

"你好" => E4 BD A0 E5 A5 BD, √
"啊" => e5 22 60, ×    //correct code is E5 95 8A

不知道该如何解决啊?看了官方 web 微信的 js 文件,并未对字段进行转码处理,难道是 angular 里自带转码么?

其实不只是node里打印出来是乱码,直接在chrome里用开发者工具看,就是乱码,但显示在网页上就是好的。


3 回复

这是 chrome devtools 的 BUG,请问 up 主后面怎么解决的?


后面直接放弃了啊

在 Electron 下对 web 微信抓包时遇到 HTTP 请求结果中文乱码的问题,通常是由于字符编码处理不当引起的。在 Node.js 中,你可以通过正确设置和解析字符编码来解决这个问题。以下是一些可能的解决方案:

  1. 确保请求头中设置了正确的编码: 在发送 HTTP 请求时,确保在请求头中设置了 Accept-Charsetutf-8。例如:

    const http = require('http');
    
    const options = {
      hostname: 'weixin.qq.com',
      port: 80,
      path: '/path/to/resource',
      method: 'GET',
      headers: {
        'Accept-Charset': 'utf-8'
      }
    };
    
    const req = http.request(options, (res) => {
      // 处理响应
    });
    
    req.end();
    
  2. 在响应中正确解析编码: 当接收到响应时,确保按照响应头中的 Content-Type 编码来解析数据。如果响应头指定了 charset=utf-8,则使用 utf-8 编码来解码数据。

    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      console.log(chunk); // 正确显示中文
    });
    
  3. 使用第三方库: 如果手动处理编码比较麻烦,可以考虑使用如 axios 这样的第三方库,它们通常会自动处理字符编码问题。

    const axios = require('axios');
    
    axios.get('http://weixin.qq.com/path/to/resource', {
      responseType: 'arraybuffer'
    })
    .then(response => {
      const data = Buffer.from(response.data, 'binary').toString('utf8');
      console.log(data); // 正确显示中文
    })
    .catch(error => {
      console.error(error);
    });
    

希望这些方法能帮助你解决中文乱码的问题。

回到顶部