网页客户端调用gSoap发布服务,以及中文乱码问题
gSoap生成的服务器端,用于C++的客户端调用时一般不存在编码问题,只需要程序自动生成的soapXXXProxy.cpp以及SoapXXXProxy.h文件即可。
网页端要调用时,将会遇到很多问题。
由于gSoap生成的是.WSDL文件,在Web服务里面现在流行的是.asmx文件。这个时候就需要用到VS自带的WSDL转换工具wsdl.exe。
@echo off @set path=F:\2012-6\temp wsdl.exe /out:myProxyClass.cs forecast.wsdl pause
在网页编程时候,将生成的myProxyClass添加进去即可。由于C++,gSoap以及ASP.NET三者之间数据类型的不同,传输中文时候会出现乱码或者缺失的现象,这个时候就必须保证三者是用同样的编码格式,推荐使用utf-8,因为其他的不懂。。。
首先是C++服务器端,读取后的数据在交给gSoap文档之前,必须将中文转换成utf-8格式。
char cGBKStr[] = "我是中国人!"; int nRetLen = GBKToUTF8((unsigned char *)cGBKStr,NULL,NULL); char * lpUTF8Str = NULL; lpUTF8Str = new char[nRetLen + 1]; nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);
第二在gSoap中设定
soap_set_mode(&s,SOAP_C_UTFSTRING);
s为forecastService s;
最后是gSoap传送回来的数据,在交给C++处理前,转换成gbk格式。
char * lpGBKStr = NULL; int nRetLen = UTF8ToGBK((unsigned char *)Request.text,NULL,NULL); //再转回来 lpGBKStr = new char[nRetLen + 1]; nRetLen = UTF8ToGBK((unsigned char *)Request.text,(unsigned char *)lpGBKStr,nRetLen);
两个转换函数可以参照以下示例
#include <stdio.h>
#include <windows.h>
//GBK编码转换到UTF8编码
int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen)
{
wchar_t * lpUnicodeStr = NULL;
int nRetLen = 0;
if(!lpGBKStr) //如果GBK字符串为NULL则出错退出
return 0;
nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度
lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间
nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码
if(!nRetLen) //转换失败则出错退出
return 0;
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度
if(!lpUTF8Str) //输出缓冲区为空则返回转换后需要的空间大小
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
if(nUTF8StrLen < nRetLen) //如果输出缓冲区长度不够则退出
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return 0;
}
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL); //转换到UTF8编码
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
// UTF8编码转换到GBK编码
int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)
{
wchar_t * lpUnicodeStr = NULL;
int nRetLen = 0;
if(!lpUTF8Str) //如果UTF8字符串为NULL则出错退出
return 0;
nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度
lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间
nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码
if(!nRetLen) //转换失败则出错退出
return 0;
nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,NULL,NULL,NULL); //获取转换到GBK编码后所需要的字符空间长度
if(!lpGBKStr) //输出缓冲区为空则返回转换后需要的空间大小
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
if(nGBKStrLen < nRetLen) //如果输出缓冲区长度不够则退出
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return 0;
}
nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL); //转换到GBK编码
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
//使用这两个函数的例子
int main()
{
char cGBKStr[] = "我是中国人!";
char * lpGBKStr = NULL;
char * lpUTF8Str = NULL;
FILE * fp = NULL;
int nRetLen = 0;
nRetLen = GBKToUTF8((unsigned char *)cGBKStr,NULL,NULL);
printf("转换后的字符串需要的空间长度为:%d ",nRetLen);
lpUTF8Str = new char[nRetLen + 1];
nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);
if(nRetLen)
{
printf("GBKToUTF8转换成功!");
}
else
{
printf("GBKToUTF8转换失败!");
goto Ret0;
}
fp = fopen("C:\GBK转UTF8.txt","wb"); //保存到文本文件
fwrite(lpUTF8Str,nRetLen,1,fp);
fclose(fp);
getchar(); //先去打开那个文本文件看看,单击记事本的“文件”-“另存为”菜单,在对话框中看到编码框变为了“UTF-8”说明转换成功了
nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,NULL,NULL); //再转回来
printf("转换后的字符串需要的空间长度为:%d ",nRetLen);
lpGBKStr = new char[nRetLen + 1];
nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,(unsigned char *)lpGBKStr,nRetLen);
if(nRetLen)
{
printf("UTF8ToGBK转换成功! ");
}
else
{
printf("UTF8ToGBK转换失败! ");
goto Ret0;
}
fp = fopen("C:\UTF8转GBK.txt","wb"); //保存到文本文件
fwrite(lpGBKStr,nRetLen,1,fp);
fclose(fp);
getchar(); //再去打开文本文件看看,发现编码框又变为了“ANSI”说明转换成功了
Ret0:
if(lpGBKStr)
delete []lpGBKStr;
if(lpUTF8Str)
delete []lpUTF8Str;
return 0;
}

浙公网安备 33010602011771号