zoukankan      html  css  js  c++  java
  • 乱码问题

    我用loadrunner录制,脚本里的乱码一直没有解决。看到网上很多贴子。
    采用的方法:1、第一步:去lr 的vugen的Tools -> Recoding Options -> Advanced -> Support charset -> UTF-8 选上。
    2、新建脚本--->选择协议(Http)-->选项-->高级-->选择“支持字符集”并点选“UTF-8”;
       在回放脚本之前:Vuser-->运行时设置-->浏览器-->浏览器仿真-->更改-->使用浏览器-->语言下来选择 “中文(中国)”;
    3、采用“首先,我们直接用正常的字去参数化,这里只举其中的一个例子来说明,比如<assuname>这个字段,我们用参数值“汽车”直接在脚本中替换“浣忔埧”,脚本回放失败。
    然后就想到会不会是所有的中文字段都需要用才行呢?于是把所有的乱码都用简体字替换,脚本回放还是失败。
        通过以上的两点试验,说明直接参数化的方法是行不通的,我们必须另找办法。
    在LoadRunner中,为我们提供了一个字符串编码转换的函数lr_convert_string_encoding,用法如下:

        int lr_convert_string_encoding ( const char *sourceString, const char *fromEncoding, const char *toEncoding, const char *paramName);”此贴的办法。
    都有没成功。大家有没有相似的问题呀,还有什么别的办法吗。

    我根据方法修改的代码如下所示:
      web_add_header("Content-Type", "text/xml; charset=UTF-8");
      
            lr_convert_string_encoding(lr__string("{NewParam_1}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");
        strcpy(tmp,lr__string("{str}"));  
            lr_log_message("str is %s",tmp);

            web_submit_data("longOpenAction!create.ilf",
                    "Action=http://10.19.69.23:7082/intel/longOpenAction!create.ilf?",
                    "Name=ciropenreqs[1].zmRegion", "Value=鏋e簞", ENDITEM,
                    "Name=ciropenreqs[1].zmUsage", "Value=绔xAFxE5眬", ENDITEM,
                    "Name=ciropenreqs[1].circuitNumber", "Value=2", ENDITEM,
                    "Name=task.procDefName", "Value=%s", ENDITEM,
                    "Name=task.actCreateTime", "Value=", ENDITEM,


    %s是我想要参数化的地方。但结果就成了%s。并没有将NewParam_1的内容代进去。先问各位应该怎么将表示才能将其跟NewParam_1的内容表示出来呀。

    知道怎么用了,在lr_convert_string_encoding(lr__string("{NewParam_1}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");
        strcpy(tmp,lr__string("{str}"));  
            lr_log_message("str is %s",tmp);
    后面加
    lr_save_string(tmp,"sorvalue");
    将:Name=task.procDefName", "Value=%s", ENDITEM,
    改为:Name=task.procDefName", "Value=sorvalue", ENDITEM, 即可。
    1.如果是浏览器IE6.0中文版:
    首先,设置Vuser---Run-time Settings-Browser-Browser Emulation-Change。
    选择6.0,chinese。点击OK。
    但发现这个东西一会儿就没了,保存不下来。
    然后,设置IE,查看-编码-钩上“自动选择”和Unicode(UTF-8)。

    这么设置完以后发现,一部分内容确实变成汉字了,但还有很多乱码未解决。而且最关键的是在LR里设置的下次录制的时候设置的都没了,没保存下来,所以继续找保存的方法,或者研究为什么没保存下来,为什么剩下的还有乱码?

    现在发现剩余的乱码开头是“$$$$$$ Response Header For Transaction With Id 7 Ended $$$$$$

    ****** Response Body For Transaction With Id 7 ******
    GIF89axE3x01”,从而发现这些乱码是一个图片,图片并不影响测试过程的进行,只要图片能正常加载就OK了。所以这个问题算是解决。

    2.还有一种方法是:
    LoadRunner的VUser Gen在录制Script时,如果网站采用的是UTF8编码,录出来的脚本,很多乱码,需要设置一下LoadRunner,方法如下:
    在Virtual User Gen的Tools->Recoding Options -> Advanced -> Support charset -> UTF-8
    就OK了。

    目前前2种方法结合起来可以解决我的问题。
    一般情况下不需要开启此选项,否则在Submit里会出现有乱码。
    如果未开启此功能还出现乱码,可尝试开启此选项。
    如果开启此选项还是有乱码,且乱码处的内容你需要进行参数化,可使用lr_convert_string_encoding函数将字符转化为你需要的模式。



    3.还搜到有高人用函数来解决。在这里摘抄一下:
    相信有不少人在使用LoadRunner的过程中都遇到过这样的问题:在录制下来的脚本的中文信息出现了乱码。关于乱码问题,可能大家在网上也能搜到不少相关的解决办法,我在这里就不多说了,大家自己去试验一下吧,到底哪个办法有效也就只有谁用谁知道了!我这里只举一个自己遇到的实际例子来说这个问题,也许不是解决这个问题的唯一办法,但至少也是其中的一个吧。
        被测系统采用Ajax技术,通过录制下来的脚本看起来像下面的样子(省略函数其它部分,下同):
        web_custom_request("CALL-H001I",
           "EncType=text/xml; charset=UTF-8",
           "BodyBinary=& lt;request><meta><verb>CALL</verb><tid>H001I< /tid></meta><data><assuid/><assutype>1< /assutype><mortkind>04< /mortkind><goodsasassuflag>0< /goodsasassuflag><assuname>浣忔埧< /assuname><papertype>01</papertype>
    <paperno>鏆傛棤鍙风爜</paperno><paperrecedate/><papergrantorgan/><turncashabil>1</turncashabil>
    <incrensuabil>1</incrensuabil><assuamt>1000000</assuamt>
    <otherassuamt>1000000.00</otherassuamt><assuleftamt /><custid>A110102641122043#1</custid><custname>闇嶈景榫"
    """x99"
           "</custname><repaynum>1</repaynum><firstmortrate /><secondmortrate/><mortstate>0</mortstate><note /><housetype>0</housetype><houseframesign /><houseformsign>01</houseformsign><housestylesign /><houseaddr>鍘﹂棬</houseaddr><housearea>100< /housearea><compdate/><houseagreno/>
    <carmarksign>A1</carmarksign>
    <carmodel/><carno/><carengino/><carcolor/><caroutyear/><carrejeyear/>
    <bankid>442000050</bankid>
    <operid>031</operid></data></request>"r"n"
           "",
           LAST);
        从上面脚本的黑体部分可以看出,LoadRunner向服务器提交的请求body部分,输入的中文字段被变成了诸如“浣忔埧” 这样的乱码。遇到这样的情况,相信大多数人和我最开始一样,只能不加理会,直接点击回放,然后我们很高兴地发现,脚本回放成功了!这些乱码是可以被LR识别的,而且到应用系统中查看运行的结果,也没有问题,显示的是正确的中文。但是且慢!先不要高兴得太早,我们很快就会意识到:如果这个字段我们是需要进行参数化的怎么办?我们应该如何造出这种乱码的字呢?
        首先,我们直接用正常的字去参数化,这里只举其中的一个例子来说明,比如<assuname>这个字段,我们用参数值“汽车”直接在脚本中替换“浣忔埧”,脚本回放失败。
    然后就想到会不会是所有的中文字段都需要用才行呢?于是把所有的乱码都用简体字替换,脚本回放还是失败。
        通过以上的两点试验,说明直接参数化的方法是行不通的,我们必须另找办法。
    在LoadRunner中,为我们提供了一个字符串编码转换的函数lr_convert_string_encoding,用法如下:

        int lr_convert_string_encoding ( const char *sourceString, const char *fromEncoding, const char *toEncoding, const char *paramName);



        该函数有4个参数,含义如下:

        sourceString:被转换的源字符串。

        fromEncoding:转换前的字符编码。

        toEncoding:要转换成为的字符编码。

        paramName:转换后的目标字符串。



        在本例中可以看到,我们需要把字符编码转换为UTF-8格式,因此用法如下:

        lr_convert_string_encoding("汽车",LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");

        这样一来,就成功地完成了字符串的编码转换。此时我们就可以对"汽车"这个参数进行参数化,参数化的方法很简单,地球人都知道!于是最终的脚本编码看起来像这样:

       lr_convert_string_encoding("lr__string("{name}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");


        完整的示例代码如下:

        char string[5000];
        char tmp[10];

        lr_convert_string_encoding(lr__string("{name}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");

       strcpy(tmp,lr__string("{str}"));                       
               sprintf(string,"BodyBinary=<request><meta><verb>CALL</verb><tid>H001I</tid></meta>
    <data><assuid/><assutype>1</assutype><mortkind>04</mortkind><goodsasassuflag>0</goodsasassuflag>
    <assuname>%s</assuname><papertype>01< /papertype><paperno>鏆傛棤鍙风爜</paperno><paperrecedate /><papergrantorgan/><turncashabil>1< /turncashabil><incrensuabil>1< /incrensuabil><assuamt>1000000< /assuamt><otherassuamt>1000000.00< /otherassuamt><assuleftamt /><custid>A110102641122043#1</custid><custname>闇嶈景榫""x99</custname><repaynum>1< /repaynum><firstmortrate/><secondmortrate /><mortstate>0</mortstate><note /><housetype>0</housetype><houseframesign /><houseformsign>01</houseformsign><housestylesign /><houseaddr>鍘﹂棬</houseaddr><housearea>100< /housearea><compdate/><houseagreno/>
    <carmarksign>A1</carmarksign><carmodel/>
    <carno/><carengino/><carcolor/><caroutyear/><carrejeyear/><bankid>442000050</bankid>
    <operid>031</operid>
    </data></request>"r"n",tmp);

        web_custom_request("CALL-H001I",
           "EncType=text/xml; charset=UTF-8",
           string,
           LAST);
     

    在使用Loadrunner录制和回放时有时候会因为乱码问题报错,且让我们很难定位出脚本问题所在。此事我们做一下分析loadrunner为什么会出现乱码这种情况呢?

    1、乱码产生的原因

    1)loadrunner软件工具本身使用的是UTF-8编码,而我们的中文系统一般使用的是GBK;GB18030等中文编码

    2)我们的被测软件对象一般使用的是utf-8编码

    =====>综上可以看出,产生乱码的情况可能会有两种情况:

    •  脚本录制过程产生的乱码
    • 脚本运行过程编码不一致产生的乱码

    2、针对产生乱码的两种情况我们的解决方法

    1)脚本录制过程中产生的乱码

    当系统和工具的编码不一致是,很明显我们要通过修改工具,使其适应被测软件所运行的系统

    解决方法:

    Tools----->Recording Options(Ctrl +F7)----->选择advanced----->选择support charset 勾选UTF-8

    2、运行过程中产生的乱码

    Vuser----->run-time-setting ------>preferences ----->options  ----general----convert from/to UTF-8 

    如果被测软件使用的是UTF-8建议选择yes

    参考:http://blog.csdn.net/z13717741865/article/details/78855771

  • 相关阅读:
    一个C#读写Dxf的类库DXFLibrary
    我的敏捷之路
    C#+GDAL读写文件
    IIS并发连接数和数据库连接池
    .net网站iis应用池完美解决方案
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    C#代码连接Oracle数据库一段时间以后[connection lost contact]的问题
    C#程序以管理员权限运行
    C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)
    Redis连接的客户端(connected_clients)数过高或者不减的问题解决方案
  • 原文地址:https://www.cnblogs.com/kaibindirver/p/8445855.html
Copyright © 2011-2022 走看看