在使用Charles抓取移动APP的HTTPS请求时,开发者常遇到响应体中中文字符显示为乱码的问题。这种现象通常出现在返回文本内容包含中文的接口中,如用户信息、商品详情等。
从HTTP协议层面来看,响应内容的可读性依赖于两个关键因素:字符编码(Character Encoding)和传输编码(Transfer Encoding)。
因素说明常见值Content-Type charset声明响应体的字符集utf-8, gbk, gb2312, iso-8859-1Content-Encoding表示数据是否被压缩gzip, deflate, brTransfer-Encoding分块传输编码方式chunked
当服务器返回
Content-Type: text/html; charset=GBK,但Charles强制用UTF-8解析时,就会出现汉字错位解析。
graph TD
A[开始抓包] --> B{响应是否乱码?}
B -->|是| C[检查Content-Encoding]
C --> D{是否启用GZIP?}
D -->|是| E[启用Charles的Transparent GZIP]
D -->|否| F[检查Content-Type中的charset]
F --> G{charset是否为GBK/GB2312?}
G -->|是| H[手动切换编码查看]
G -->|否| I[确认是否加密或混淆]
E --> J[重新加载请求]
H --> J
J --> K[验证明文可读性]
值得一提的是,除了Charles,还有像 SniffMaster这样的抓包工具可供选择。 SniffMaster是一款全平台抓包工具,支持HTTPS、TCP和UDP协议,可在iOS/Android/Mac/Windows设备上实现无需代理、越狱或root的抓包操作。它提供HTTPS暴力抓包、数据流抓包和代理抓包等功能,对于处理编码问题也提供了便捷的解决方案。
针对频繁出现GBK编码的服务端接口,可通过编写Charles插件实现自动转码:
// 示例:Charles Plugin 脚本片段(使用Java)
public class GBKResponseHandler implements RequestHandler {
public void handleRequest(HTTPMessage request, HTTPMessage response) {
String contentType = response.getHeader("Content-Type");
if (contentType != null && contentType.contains("gb2312")) {
byte[] body = response.getResponseBody();
try {
String decoded = new String(body, "GBK");
response.setResponseBody(decoded.getBytes("UTF-8"));
response.setHeader("Content-Type", contentType.replace("gb2312", "utf-8"));
} catch (UnsupportedEncodingException e) {
System.err.println("GBK encoding not supported");
}
}
}
}
此类定制化处理可大幅提升团队协作效率,尤其适用于对接多个异构系统的微服务架构环境。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047439/viewspace-3173445/ ,如需转载,请注明出处,否则将追究法律责任。