gSoap传输中文出现乱码的解决方案
最近写WebService程序时,遇到了一个很棘手的问题:通过SOAP接口传输中文字符时出现乱码。
我是用C++编写服务端,框架代码由gSoap自动生成;SOAP接口对外开放,允许使用C++,Java和C#中任意一种语言编写客户端。gSoap默认的编码方式是UTF-8,用gSoap自动生成的客户端代码编写出来的程序传输中文字符时不会出现任何问题,但用Java或C#传输过来的中文全部变成了乱码。
在网上查了一下资料,发现遇到同样问题的人不少,但真正能解决问题的方法却很少,虽然有几个人提出了解决方案,但试过之后总是不行。
下面提供一种有效的解决方案:编码转换。其原理是将中文字符按字节转换成十六进制码,十六进制码仅含数字和字母,因此传输过程中不会出现乱码,传到服务端之后再将十六进制码转换回来就可以了。
十六进制码与普通字符串的互转函数如下:
C++版:
/////////////////////////////////
char hexchar[]=
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'
};
char hexval(char c)
{
char cRet;
if ('0'<=c && c<='9')
cRet = (unsigned char)c - 48;
if ('A'<=c && c<='F')
cRet = (unsigned char)c - 55;
if ('a'<=c && c<='f')
cRet = (unsigned char)c - 87;
return cRet;
}
//pSrc : 原字符串
//pDst : 目标字符串
//nMaxLen : 输出缓冲区大小
int Str2HexStr(const char *pSrc, char *pDst, int nMaxLen)
{
if (!pSrc || !pDst)
return -1;
char high, low;
int nLen = strlen(pSrc);
if (nMaxLen < 2*nLen)
return 1;
for (int i=0; i
{
high = (unsigned char)pSrc[i] / 16;
low = (unsigned char)pSrc[i] % 16;
pDst[2*i] = hexchar[high];
pDst[2*i+1] = hexchar[low];
}
return 0;
}
int HexStr2Str(const char *pSrc, char *pDst, int nMaxLen)
{
char hign, low;
int nLen = strlen(pSrc);
if (nMaxLen < (nLen/2+1))
return 1;
for (int i=0; i
{
hign = hexval(pSrc[2*i]) * 16;
low = hexval(pSrc[2*i+1]);
pDst[i] = hign+low;
}
return 0;
}
Java版:
private String Str2HexStr(String sSrc, int len) {
char ch[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
String sDes = "";
int high, low;
for (int i = 0; i < len; i++) {
high = (sSrc.getBytes()[i] < 0 ? (256 + sSrc.getBytes()[i]) : sSrc.getBytes()[i]) / 16;
low = (sSrc.getBytes()[i] < 0 ? (256 + sSrc.getBytes()[i]) : sSrc.getBytes()[i]) % 16;
sDes += ch[high];
sDes += ch[low];
}
return sDes;
}
C#版:
static string StrToHex(string str)
{
string strTemp = "";
byte[] bTemp = System.Text.Encoding.Default.GetBytes(str);
for(int i = 0;i
{
strTemp += bTemp[i].ToString("X");
}
return strTemp;
}
其中Java和C#仅有普通串转十六进制串的方法,反方向的如有需要,可自行参照C++代码编写。
其实该方法还可以解决不可见字符不能写入Oracle数据库的问题,有兴趣的朋友可以深入研究。
忘了在哪里转载的。。。。
分享到:
相关推荐
标题"**gsoap wcf https解决方案**"所涵盖的知识点主要涉及到gSOAP库的使用、WCF服务的配置以及HTTPS安全通信机制。 首先,**gSOAP**是一个开源C/C++工具包,用于生成跨平台的Web服务客户端和服务器代码。gSOAP ...
- **移动设备开发**:对于资源受限的移动设备,如PDA、智能手机等,gSOAP提供了轻量级的解决方案,使得在有限的硬件条件下仍能高效运行Web服务。 - **科研与教育**:在科研项目和教育领域,gSOAP提供了丰富的学习和...
### gSOAP中文文档知识点概述 #### 一、gSOAP简介 **gSOAP**是一款功能强大的工具,它为C/C++语言提供了SOAP/XML的实现支持,极大地简化了开发Web服务及客户端程序的过程。与大多数C++ Web服务工具包提供的固定API...
在“gsoap中文文档”中,读者可以了解到gSOAP的基本结构和使用方法。这份文档通常会包含以下内容: 1. **gSOAP简介**:介绍gSOAP项目的历史、目标以及在分布式计算中的重要性。 2. **SOAP和WSDL概述**:解释SOAP...
通过深入阅读gSOAP的中文文档,开发者可以学习如何配置和使用gSOAP工具,创建SOAP客户端和服务端,处理复杂的XML数据,以及实现安全的Web服务通信。理解这些知识点对于任何希望在C或C++中实现Web服务的人来说都是至...
5. **错误处理**:gSOAP提供了一套完整的错误处理机制,通过`soapFault`结构体,开发者可以检查并处理通信过程中出现的问题。 6. **安全特性**:gSOAP支持HTTPS和其他安全协议,确保Web服务的安全通信。此外,还...
gSOAP2.8源码包是一个强大的开源工具,专为跨平台Web Service开发设计,支持Windows、Linux、Mac OS以及UNIX等操作系统。...通过深入理解和熟练运用gSOAP,开发者可以高效地构建高质量的Web Service解决方案。
在本文中,我们将深入探讨如何在Windows 7环境下,利用Visual C++(VC)和gSOAP库实现Web服务文件传输的示例。gSOAP是一个开源的C和C++ Web服务工具包,它允许开发者轻松地创建和使用SOAP(简单对象访问协议)服务,...
gSOAP(Generic SOAP)是一个开源项目,用于生成C和C++代码,以便在不同系统间进行Web服务通信。gSOAP 2.8是这个项目的最新版本,它包含了全面的工具和库,支持Windows、Linux以及macOS等操作系统,确保了跨平台的...
gsoap,直接下载,调用函数即可,实现通讯
gSOAP(Generic SOAP)是一个开源工具包,用于在C和C++中实现Web服务和SOAP(Simple Object Access Protocol)客户端...在实际项目中,理解如何正确配置和使用gSOAP工具,以及如何处理可能出现的问题,都是至关重要的。
- **编码/解码优化**:gSOAP使用高效的二进制XML编码方式,提高数据传输效率。 - **错误处理**:提供详细的错误信息和调试支持。 总结,gSOAP是一个强大的工具,用于构建和消费SOAP Web服务。通过其自动生成的代码...
1. 配置gSOAP:首先,需要下载并安装gSOAP,然后使用gSOAP的wsdl2h工具生成服务头文件,该文件包含了Web API接口的定义。 2. 编码请求:使用gSOAP提供的库函数,如soap_init()初始化SOAP环境,然后设置HTTP GET请求...
web service开发包 我最近在学,自己整理了下 和兄弟们分享下
《gSOAP 2.8.8在VC环境下的Web服务开发详解》 gSOAP是一个开源的C/C++软件工具包,专为构建基于SOAP(Simple ...无论你是在构建企业级的SOA架构,还是在创建简单的RESTful服务,gSOAP都能为你提供可靠的解决方案。
gSOAP 编译工具提供了一个SOAP关于C/C++ 语言的实现,从而让C/C++语言开发Web Services服务端或客户端程序的工作变得轻松了很多。甚至,即使你对Web Services不甚了解都没有关系,有了gSOAP这样的工具,你也能开发...
【基于GSOAP的短信发布机制】是一个无需添加Web引用的短信发送解决方案,它利用GSOAP开发包实现跨语言和跨平台的短信服务交互。GSOAP是一个将SOAP/XML协议绑定到C/C++语言的工具,使得开发者能快速方便地构建SOAP/...
总之,gSOAP是一个全面的解决方案,它简化了SOAP通信的实现,让开发者可以专注于业务逻辑,而不是底层网络通信的细节。通过使用gSOAP,您可以快速创建跨平台的Web服务客户端和服务端应用程序,无论是对于天气预报API...
共有三个客户端三个服务端,使用VS2008 分别测试gsoap 两个数的加法操作,传递参数为结构体,传递参数为结构体数组,有一份doc文档记录,在我的博客《VS2008 gsoap 笔记》也可以看到和文档一样的文章 ,gsoap版本为...