Jmeter结果树内返回了非中文,中文返回了Unicode编码

Jmeter,查看结果树,返回了非中文,中文返回了Unicode编码

前提

本人请求均是json格式请求

查找过程

当时尝试了多种方法,由于查找了有部分博文都是说可以直接添加BeanShell PostProcessor,在其中加一段代码就可以解决,或者是可以通过修改配置,但是加代码这种方式也提到了一些副作用,会占用资源,可能在高并发测试过程中会有点影响结果,修改配置的话由于也不是特别想要修改,所以也没有尝试,所以就尝试了其他方式,发现基本都没有用;

尝试过的方式如下

1、第一种方法,在HTTP Header Manager中添加 Accept-Charset:utf-8,发现并没有用
2、第二种方法,在HTTP Header Manager中添加Content-Type:charset=utf-8,发现也没有用
最后还是无用,所以用了BeanShell PostProcessor中添加代码的方式
1、添加的这段代码发现并不生效,代码段是: prev.setDataEncoding(“UTF-8”);
2、后来添加过两段代码,代码段一没生效,代码段二生效了,这(代码段放在后面了,均是查找到的其他博文的,链接放在最后了)
最后发现原来查看结果树里面设置查看方式是json则展示就是中文的,如果是text就是unicode的;

在这,不得不说一下,当时的历程

当时已经把查看结果树的显示格式改成了json,但是不想用添加代码的这种方法,所以又继续找,看到一篇博文给了启发,在请求头管理器中添加Content-Type:application/json,成功的返回了中文;还得出了感慨:“还是自己的经验太少了呀,之前不想在请求头里面加就是因为有些接口不是使用的这种格式,但是自己的请求里面也没写,成功运行了,所以不想加,没想到啊,加了就好了”。结果最后去结果树里面把显示格式一改,改成text,打回原形,还是显示的Unicode,啪啪打脸。
上面发现不行,还是后面为了验证如果不添加是会不返回中文,再去看了一下,发现不传也可以,这不是和我之前一开始出现问题有矛盾嘛,再一看,原来查看结果树里面设置了查看方式是json,如果改成text的话就都不生效了;
为了验证每种方案的有效性,将显示格式设置成text后,上面只有添加代码段二的方式会生效了(改配置的没有进行过尝试);所以原来是如果查看方式是text那么久只有代码段二才有效,查看方式是json的话不设置任何内容都有效

总结

1、如果发现查看结果树内的数据中文是Unicode编码方式展示,那么首先看如果自己的返回结果是json则将查看方式切换到json格式,如果不是,则另说
2、如果展示方式需要是text方式就可以尝试代码段二这种(本人尝试生效了)以及改配置看看能不能行(这个没有去尝试),可能还是根据个人的接口不同将会有不同的结果吧
以上本人场景均是json类型

代码段一,添加了之后重启了jmeter也没用

//获取响应代码Unicode编码的


        String s2=new String(prev.getResponseData(),"UTF-8");
//---------------一下步骤为转码过程---------------
        char aChar;
        int len= s2.length();
        StringBuffer outBuffer=new StringBuffer(len);
        for(int x =0; x <len;){
            aChar= s2.charAt(x++);
            if(aChar=='\\'){
                aChar= s2.charAt(x++);
                if(aChar=='u'){
                    int value =0;
                    for(int i=0;i<4;i++){
                        aChar= s2.charAt(x++);
                        switch(aChar){
                            case'0':
                            case'1':
                            case'2':
                            case'3':
                            case'4':
                            case'5':
                            case'6':
                            case'7':
                            case'8':
                            case'9':
                                value=(value <<4)+aChar-'0';
                                break;
                            case'a':
                            case'b':
                            case'c':
                            case'd':
                            case'e':
                            case'f':
                                value=(value <<4)+10+aChar-'a';
                                break;
                            case'A':
                            case'B':
                            case'C':
                            case'D':
                            case'E':
                            case'F':
                                value=(value <<4)+10+aChar-'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx  encoding.");}}
                    outBuffer.append((char) value);}else{
                    if(aChar=='t')
                        aChar='\t';
                    else if(aChar=='r')
                    aChar='\r';
                    else if(aChar=='n')
                    aChar='\n';
                    else if(aChar=='f')
                    aChar='\f';
                    outBuffer.append(aChar);}}else
                outBuffer.append(aChar);}

代码段二,添加之后可以了,返回的是中文了

private static String ascii2native ( String asciicode )
{
    String[] asciis = asciicode.split ("\\\\u");
    String nativeValue = asciis[0];
    try
    {
        for ( int i = 1; i < asciis.length; i++ )
        {
            String code = asciis[i];
            nativeValue += (char) Integer.parseInt (code.substring (0, 4), 16);
            if (code.length () > 4)
            {
                nativeValue += code.substring (4, code.length ());
            }
        }
    }
    catch (NumberFormatException e)
    {
        return asciicode;
    }
    return nativeValue;
}
String asciicode =new String(prev.getResponseData(),"UTF-8");
prev.setResponseData(ascii2native(asciicode));

给启发的博文:https://www.cnblogs.com/gloria-5/p/12468874.html
代码段一博文:https://blog.csdn.net/chenfeng_he/article/details/77743231
代码段二博文:https://www.cnblogs.com/peng-lan/p/12021101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值