Electron 下对 web 微信抓包 HTTP 请求结果有中文乱码,Nodejs 如何解决?
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里用开发者工具看,就是乱码,但显示在网页上就是好的。
这是 chrome devtools 的 BUG,请问 up 主后面怎么解决的?
后面直接放弃了啊
在 Electron 下对 web 微信抓包时遇到 HTTP 请求结果中文乱码的问题,通常是由于字符编码处理不当引起的。在 Node.js 中,你可以通过正确设置和解析字符编码来解决这个问题。以下是一些可能的解决方案:
-
确保请求头中设置了正确的编码: 在发送 HTTP 请求时,确保在请求头中设置了
Accept-Charset
为utf-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();
-
在响应中正确解析编码: 当接收到响应时,确保按照响应头中的
Content-Type
编码来解析数据。如果响应头指定了charset=utf-8
,则使用utf-8
编码来解码数据。res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(chunk); // 正确显示中文 });
-
使用第三方库: 如果手动处理编码比较麻烦,可以考虑使用如
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); });
希望这些方法能帮助你解决中文乱码的问题。