51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3302|回复: 1
打印 上一主题 下一主题

[原创] LoadRunner脚本中的乱码问题以及解决办法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-10-31 13:23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相信有不少人在使用LoadRunner的过程中都遇到过这样的问题:在录制下来的脚本的中文信息出现了乱码。关于乱码问题,可能大家在网上也能搜到不少相关的解决办法,我在这里就不多说了,大家自己去试验一下吧,到底哪个办法有效也就只有谁用谁知道了!我这里只举一个自己遇到的实际例子来说这个问题,也许不是解决这个问题的唯一办法,但至少也是其中的一个吧。
    被测系统采用Ajax技术,通过录制下来的脚本看起来像下面的样子(省略函数其它部分,下同):
    web_custom_request("CALL-H001I",
        "EncType=text/xml; charset=UTF-8",
        "BodyBinary =<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_eval_string("{name}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");

    完整的示例代码如下:

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

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

    strcpy(tmp,lr_eval_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);

[ 本帖最后由 xingcyx 于 2007-10-31 13:27 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-10-31 13:33:17 | 只看该作者
鼓励一下你。
这娃长进了,知道总结了。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-22 21:25 , Processed in 0.075488 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表