网页客户端调用gSoap发布服务,以及中文乱码问题
gSoap生成的服務(wù)器端,用于C++的客戶端調(diào)用時(shí)一般不存在編碼問(wèn)題,只需要程序自動(dòng)生成的soapXXXProxy.cpp以及SoapXXXProxy.h文件即可。
網(wǎng)頁(yè)端要調(diào)用時(shí),將會(huì)遇到很多問(wèn)題。
???? 由于gSoap生成的是.WSDL文件,在Web服務(wù)里面現(xiàn)在流行的是.asmx文件。這個(gè)時(shí)候就需要用到VS自帶的WSDL轉(zhuǎn)換工具wsdl.exe。
@echo off @set path=F:\2012-6\temp wsdl.exe /out:myProxyClass.cs forecast.wsdl pause? 在網(wǎng)頁(yè)編程時(shí)候,將生成的myProxyClass添加進(jìn)去即可。由于C++,gSoap以及ASP.NET三者之間數(shù)據(jù)類型的不同,傳輸中文時(shí)候會(huì)出現(xiàn)亂碼或者缺失的現(xiàn)象,這個(gè)時(shí)候就必須保證三者是用同樣的編碼格式,推薦使用utf-8,因?yàn)槠渌牟欢!!?/p>
首先是C++服務(wù)器端,讀取后的數(shù)據(jù)在交給gSoap文檔之前,必須將中文轉(zhuǎn)換成utf-8格式。
char cGBKStr[] = "我是中國(guó)人!"; 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中設(shè)定
soap_set_mode(&s,SOAP_C_UTFSTRING);????? s為forecastService s;
最后是gSoap傳送回來(lái)的數(shù)據(jù),在交給C++處理前,轉(zhuǎn)換成gbk格式。
char * lpGBKStr = NULL;int nRetLen = UTF8ToGBK((unsigned char *)Request.text,NULL,NULL); //再轉(zhuǎn)回來(lái)lpGBKStr = new char[nRetLen + 1];nRetLen = UTF8ToGBK((unsigned char *)Request.text,(unsigned char *)lpGBKStr,nRetLen);???? 兩個(gè)轉(zhuǎn)換函數(shù)可以參照以下示例
#include <stdio.h>#include <windows.h>
//GBK編碼轉(zhuǎn)換到UTF8編碼
int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen)
{
wchar_t * lpUnicodeStr = NULL;
int nRetLen = 0;
if(!lpGBKStr) //如果GBK字符串為NULL則出錯(cuò)退出
return 0;
nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL); //獲取轉(zhuǎn)換到Unicode編碼后所需要的字符空間長(zhǎng)度
lpUnicodeStr = new WCHAR[nRetLen + 1]; //為Unicode字符串空間
nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //轉(zhuǎn)換到Unicode編碼
if(!nRetLen) //轉(zhuǎn)換失敗則出錯(cuò)退出
return 0;
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //獲取轉(zhuǎn)換到UTF8編碼后所需要的字符空間長(zhǎng)度
if(!lpUTF8Str) //輸出緩沖區(qū)為空則返回轉(zhuǎn)換后需要的空間大小
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
if(nUTF8StrLen < nRetLen) //如果輸出緩沖區(qū)長(zhǎng)度不夠則退出
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return 0;
}
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL); //轉(zhuǎn)換到UTF8編碼
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
// UTF8編碼轉(zhuǎn)換到GBK編碼
int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)
{
wchar_t * lpUnicodeStr = NULL;
int nRetLen = 0;
if(!lpUTF8Str) //如果UTF8字符串為NULL則出錯(cuò)退出
return 0;
nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,NULL); //獲取轉(zhuǎn)換到Unicode編碼后所需要的字符空間長(zhǎng)度
lpUnicodeStr = new WCHAR[nRetLen + 1]; //為Unicode字符串空間
nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen); //轉(zhuǎn)換到Unicode編碼
if(!nRetLen) //轉(zhuǎn)換失敗則出錯(cuò)退出
return 0;
nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,NULL,NULL,NULL); //獲取轉(zhuǎn)換到GBK編碼后所需要的字符空間長(zhǎng)度
if(!lpGBKStr) //輸出緩沖區(qū)為空則返回轉(zhuǎn)換后需要的空間大小
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
if(nGBKStrLen < nRetLen) //如果輸出緩沖區(qū)長(zhǎng)度不夠則退出
{
if(lpUnicodeStr)
delete []lpUnicodeStr;
return 0;
}
nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL); //轉(zhuǎn)換到GBK編碼
if(lpUnicodeStr)
delete []lpUnicodeStr;
return nRetLen;
}
//使用這兩個(gè)函數(shù)的例子
int main()
{
char cGBKStr[] = "我是中國(guó)人!";
char * lpGBKStr = NULL;
char * lpUTF8Str = NULL;
FILE * fp = NULL;
int nRetLen = 0;
nRetLen = GBKToUTF8((unsigned char *)cGBKStr,NULL,NULL);
printf("轉(zhuǎn)換后的字符串需要的空間長(zhǎng)度為:%d ",nRetLen);
lpUTF8Str = new char[nRetLen + 1];
nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);
if(nRetLen)
{
printf("GBKToUTF8轉(zhuǎn)換成功!");
}
else
{
printf("GBKToUTF8轉(zhuǎn)換失敗!");
goto Ret0;
}
fp = fopen("C:\GBK轉(zhuǎn)UTF8.txt","wb"); //保存到文本文件
fwrite(lpUTF8Str,nRetLen,1,fp);
fclose(fp);
getchar(); //先去打開(kāi)那個(gè)文本文件看看,單擊記事本的“文件”-“另存為”菜單,在對(duì)話框中看到編碼框變?yōu)榱恕癠TF-8”說(shuō)明轉(zhuǎn)換成功了
nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,NULL,NULL); //再轉(zhuǎn)回來(lái)
printf("轉(zhuǎn)換后的字符串需要的空間長(zhǎng)度為:%d ",nRetLen);
lpGBKStr = new char[nRetLen + 1];
nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,(unsigned char *)lpGBKStr,nRetLen);
if(nRetLen)
{
printf("UTF8ToGBK轉(zhuǎn)換成功! ");
}
else
{
printf("UTF8ToGBK轉(zhuǎn)換失敗! ");
goto Ret0;
}
fp = fopen("C:\UTF8轉(zhuǎn)GBK.txt","wb"); //保存到文本文件
fwrite(lpGBKStr,nRetLen,1,fp);
fclose(fp);
getchar(); //再去打開(kāi)文本文件看看,發(fā)現(xiàn)編碼框又變?yōu)榱恕癆NSI”說(shuō)明轉(zhuǎn)換成功了
Ret0:
if(lpGBKStr)
delete []lpGBKStr;
if(lpUTF8Str)
delete []lpUTF8Str;
return 0;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/bleedfish/archive/2012/02/29/2373938.html
總結(jié)
以上是生活随笔為你收集整理的网页客户端调用gSoap发布服务,以及中文乱码问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery-对Select的操作集合
- 下一篇: 第三道深搜-----------hdu1