由于目前很多服务器采用的都是 UTF-8 编码方式,而Loadrunner脚本中使用的编码方式为GBK,如果直接将中文作为参数传给服务器,则会由于编码不一致导致报错。因此需要对脚本中的中文进行转码。
方法:使用lr_convert_string_encoding函数转码
例如将需要将“张三”作为参数传递,脚本如下:
lr_convert_string_encoding( "张三", //原参数值
LR_ENC_SYSTEM_LOCALE, //原编码方式
LR_ENC_UTF8, //目标编码方式
"zs" ); //编码转换后的参数值
转码完成后,就可以使用 {zs} 将“张三”传给服务器了。
但是!
当我以为这样就万事大吉的时候,被Loadrunner当头一棒打得有点蒙:转换编码以后的字符串最后一定会带有 \x00 这几个字符。这样显然会导致传值不正确。
经过几番折腾确认这是Loadrunner的一个问题,不管是Loadrunner9.5还是比较新的Loadrunner11都会有这个问题。查看Loadrunner中关于lr_convert_string_encoding函数说明中标红的说明:The function saves the result string, including its terminating NULL, in the parameterparamName。也就是说,当转换编码为UTF-8之后,如果直接作为变量传值的话,在最后的字符串之中,会多出来一个“NULL”,在C语言中NULL是一个字符串的结束,而正是这个NULL字节的存在导致出错。
为了解决这个问题不得已又学了一招,脚本如下:
char tmp1[50]; //注意:Loadrunner中定义变量要在脚本最开始
strcpy(tmp1,lr_eval_string("{zs}")); //将zs的值取出并拷贝给tmp1,前提是要在脚本最初定义好tmp1,即 char tmp1[50]
lr_log_message("str is %s",tmp1); //在回放日志中打印tmp1的值以便查看、非必要
lr_save_string(tmp1,"tmp2"); //将tmp1的值传给tmp2
这段脚本是利用lr_eval_string函数取参数值时会自动去掉\x00。这样处理过后传值给服务器的时候就要使用{tmp2},而不再是{zs}。经过测试,结果正确。