Charles是Mac系统中相对比较好用的抓包工具。用Charles抓包时,常会用MapLocal功能,把不同的接口映射到不同的本地Json文件,方便测试。我会把一些常用的接口Response数据放到一个文件夹里,有需要的时候随时可以重复利用。
但是Charles设置MapLocal总是会出现乱码,包括网上很多Charles教程中的截图也可以看到乱码,但是网上没有找到解决方案,没有人提出怎么解决这个问题。
觉得可能是本地文件编码格式不对,于是改了MapLocal所映射本地json文件的编码,发现乱码会发生变化。
又感觉可能是Charles的BUG。后来试了下发现只有Android中会乱码,而iOS中竟然没有乱码。
于是怀疑是客户端代码相关的问题,APP用的网络框架是Volley,网上找了下“Volley Charles 乱码”,终于找到了原因:
在Response的Header中如果没有指定编码,Volley会默认使用ISO-8859-1,不支持中文,导致乱码(其他网络框架可能也会有同样问题)。解决思路是,让返回的数据Header中Content-Type
字段声明charset=UTF-8
。
参考:http://my.oschina.net/u/1247737/blog/393959
看了下Charles中MapLocal,Content-Type
中果然没有声明编码。
在菜单中找了找,有个Rewrite功能,尝试了一下,顺利解决了问题。
1、选择Tools – Rewrite
2、勾选Enable Rewrite启用Rewrite功能。点击左侧Sets中的Add按钮,添加一条Rewrite规则,可以设置一个名字。
3、点击右侧Locations中的Add,弹出窗口如下。可以全部留空匹配所有请求。也可以根据需要过滤指定的接口,然后点击OK确认。
4、点击Rules中的Add按钮,添加一条规则,弹出窗口中设置如下。修改Response的Header,匹配Content-Type = text/plain
的项,并将其替换成Content-Type = application/json;charset=UTF-8
(根据实际情况进行设置)。点击OK保存。
5、最终设置好后的效果如下。再次使用MapLocal功能时,发现乱码问题已经解决了(前提是所映射的本地文件也是UTF-8编码,通常在Mac系统中,默认支持中文的编码就是UTF-8)。