问题现象

搭建自动测试服务器时,发现使用jmeter 访问接口,其返回的内容中文会乱码。同样的接口使用postman进行测试,则呈现良好无乱码。服务器端接口返回的编码是utf-8编码。 显然,应该是jmeter 对返回内容的解析与服务器端返回的编码不一致导致的。推测,postman应该是默认用的utf-8编码,与浏览器一致。

第一步设置jmeter的默认编码

由于我的jmeter是mac上使用brew安装的,因此路径可能与windows等不同。

编辑 /usr/local/Cellar/jmeter/5.4.3/libexec/bin/jmeter.properties 文件

jmeter.properties 文件中搜索 sampleresult.default.encoding 找到的默认如下:

;sampleresult.default.encoding=ISO-8859-1

将其修改为

# 注意去掉行首的英文分号;
sampleresult.default.encoding=utf-8

重启jmeter 访问接口,问题依旧。于是,有了第二步。

第二步修改nginx默认编码

通过观察接口的返回头,发现Content-type:application/json,并没有设置字符集。 而通常情况下返回的头应该是Content-type:application/json; charset=utf-8,显然同时需要修改服务器端设置才行。 由于服务器端使用nginx作为代理服务器。因此直接可以在nginx.conf修改配置 在 server或location 节点内,增加如下设置

# charset_type 用表示应用与该类型的返回,*标识用于所有类型的返回
charset_types *;
# 设置返回的内容编码为utf-8
charset utf-8;

保存后,重启nginx

nginx -s reload

第三步确认编码效果

在jmeter中再次请求该接口,此时发现返回的头为Content-type:application/json; charset=utf-8,并且结果中的中文在 jmeter里也是正常的显示的,无乱码。 至此,问题解决。