解决方法一:
在main函数里初始化soap结构体后加入
soap_set_mode(&soap,SOAP_C_UTFSTRING);
这样所有的C都是utf-8的格式,只要你的windows客户端支持UTF-8格式就没有了乱码问题
解决方法二:iconv库转码
一般在ubuntu中都会预装iconv的库,使用也很简单,网上的教程很多..
下面的函数,在需要转码的地方调用即可
#include <iconv.h>
#ifdef ICONV_EN
/*
用户中文乱码问题,格式转换用!
ARG:
dest:目的格式
src:原格式
input:输入字符串
...*/ int conv_charset(const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen) {
char **inbuf = &input;
char **outbuf = &output;
if(dest == NULL || src == NULL)
return -1;
iconv_t conv = iconv_open(dest, src);
if ( conv == (iconv_t) -1 )
return -1;
memset(output, 0, olen);
printf("dest=%s,src=%s,input=%s,output=%s,olen=%d\n",dest,src,*inbuf,*outbuf,olen);
if ( iconv(conv, inbuf, &ilen, outbuf, &olen) )
return -1;
printf("output=%s\n",output); //此处打印output为空,正常
iconv_close(conv);
return 0;
}
#endif
函数的使用,一般windows支持GBK和GB2312格式,现在的windows强制支持GB18030,转为这个格式很好的!
函数都是亲测可用的,给大家分享,一块进步...
int send_msg_xml(struct soap *soap,char *msg)
{
struct Namespace *nsmap;
nsmap = NULL;
soap->encodingStyle = NULL;
soap_set_omode(soap,SOAP_XML_TREE);
soap->http_content = "text/xml";
soap_set_namespaces(soap,nsmap);
soap_begin_send(soap);
#ifdef ICONV_EN
char *buff/*[OUTPUT_LEN]={0}*/;
//转码
buff = (char *)malloc(OUTPUT_LEN);
if(conv_charset("GBK","UTF-8",msg,(int)strlen(msg),buff,(int)OUTPUT_LEN) != 0)
{
#endif
soap_serialize_string(soap, &msg);
soap_put_string(soap, &msg, "RET_MSG", NULL);
#ifdef ICONV_EN
}else{
soap_serialize_string(soap, &buff);
soap_put_string(soap, &buff, "RET_MSG", NULL);
}
#endif
soap_end_send(soap); // Clean up temporary data used by the serializer
return SOAP_OK; }