Hi, 如果有任何想法与我沟通, 请用: lifr_nj 在 msn.com

发布新日志

  • QALoad: 在中文环境录制utf8编码的xml request

    2007-08-23 22:32:12

    但是如果locale设置为China,那么QALoad录制的脚本将是是GB2312编码的。也就是说,QALoad在拼接字符串的时候,如果字符串里面有中文,那么它是GB2312编码的。比如
        CLoadString buf;
        const char* str = "abc汉字def";
        buf += str;

    在这里str是GB2312编码,长度是3+2+2+3 = 10;

    如果在脚本里拼接了一个xml request的字符串,且里面有中文,那么问题就出现了。字符串是用gb2312编码的,但实际上一般来说,xml request/response都是utf8编码的。这个时候就需要做从gb2312到utf8的编码转换。

    关于ANSI编码(GB2312是ANSI编码的一种)和Unicode编码问题的一篇很好的文章:http://www.regexlab.com/zh/encoding.htm

    这个编码转换需要一个叫conv的lib,在这里下载 http://gnuwin32.sourceforge.net/, 下载安装到目录假设为$install
    1. 把$install/bin/libiconv2.dll拷贝到C:\WINNT\system32,
    2. 把$install/include目录加入到 c++ compiler include. 访问途径Menu: Option->C++ Compiler Option
    3. 把$install/lib/libconv.lib加入到c++ compiler library. 访问途径Menu: Option->C++ Compiler Option

    转换实例代码如下
     char * xmlStr = "....";//xmlStr contains the xml to be sent, GB2312 encoded.
     unsigned int ilen = strlen(xmlStr); //input buffer length
     unsigned int ōlen = ilen *  2; //output buffer length

     char * utf8XmlStr = (char *)malloc( olen); //acquire output buffer
     memset(utf8XmlStr, 0, olen);

     //duplicate an output buffer pointer, 
     //because pointer value will be chaneged in function "iconv"
     char* utf8XmlPtr = utf8XmlStr;
     iconv_t cd = iconv_open("utf-8", "gb2312"); //gb2312 -> utf-8
     iconv(cd, &xmlStr, &ilen, &utf8XmlPtr, &olen);
     iconv_close(cd);
    free(utf8XmlStr);
    utf8XmlStr=NULL;

       

Open Toolbar