Jmeter乱码

  • A+
所属分类:测试

【背景】

1、使用jmeter的小伙伴多多少少都会有遇见中文乱码的问题,主要有请求体中文乱码、响应报文的中文乱码以及文件上传的中文乱码。

【原因】

jmeter源码里默认的编码是ISO-8859-1。

【处理方法】

通过设置和修改源码两种主要方式来解决中文乱码问题。

处理方式一:

在HTTP请求控件指向UTF-8,解决请求中文乱码,如下图:

Jmeter乱码

处理方式二:

在jmeter/bin路径下的jmeter.properties,第1098行,将默认的encoding=ISO-8859-1改为UTF-8,解决返回结果的中文乱码,如下


  1. # The encoding to be used if none is provided (default ISO-8859-1)


  2. #sampleresult.default.encoding=ISO-8859-1


  3. sampleresult.default.encoding=UTF-8

 处理方式三:

在源码中进行强制修改,将默认的encoding改为UTF-8,解决所有的中文乱码问题。

1、在RequestViewHTTP类中将CHARSET_DECODE赋值为UTF-8,RequestViewHTTP在“\src\protocol\http\src\main\java\org\apache\jmeter\protocol\http\visualizers”这个路径下,也可以通过Ctrl+Shift+F(Commad+Shift+F)直接搜索RequestViewHTTP。如下图 

Jmeter乱码

 2、修改SampleResult类中的 DEFAULT_HTTP_ENCODING的值,将默认的 ISO_8859_1改为UTF-8。SampleResult类在Samples下面,“\src\core\src\main\java\org\apache\jmeter\samplers”,如下图

Jmeter乱码

3、通过修改 HTTPHC4Impl 类中的setupHttpEntityEnclosingRequestData方法,HTTPHC4Imp类在路径“\src\protocol\http\src\main\java\org\apache\jmeter\protocol\http\sampler”当为Multipar类型的时候设置Charset的值,修改源码如下,


  1. protected String setupHttpEntityEnclosingRequestData(HttpEntityEnclosingRequestBase entityEnclosingRequest)  throws IOException {


  2. // Buffer to hold the post body, except file content


  3. StringBuilder postedBody = new StringBuilder(1000);


  4. HTTPFileArg[] files = getHTTPFiles();



  5. final String contentEncoding = getContentEncodingOrNull();


  6. final boolean haveContentEncoding = contentEncoding != null;



  7. // Check if we should do a multipart/form-data or an


  8. // application/x-www-form-urlencoded post request


  9. if(getUseMultipart()) {


  10. ......


  11. // Write the request to our own stream


  12. MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();


  13. if(getDoBrowserCompatibleMultipart()) {


  14. multipartEntityBuilder.setLaxMode();


  15. // 解决上传文件的中文乱码


  16. if (haveContentEncoding){


  17. multipartEntityBuilder.setCharset(Charset.forName(contentEncoding));


  18. }


  19. } else {


  20. multipartEntityBuilder.setStrictMode();


  21. }


  22. ......


  23. }

增加了下面的代码对文件编码进行判断和赋值


  1. if (haveContentEncoding){


  2. multipartEntityBuilder.setCharset(Charset.forName(contentEncoding));


  3. }

【总结】

通过以上两种方式可以解决jmeter的中文乱码问题。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: