恳请高手帮忙,关于Web Serive的乱码问题

7710703 2003-04-09 01:18:01
现在是由.net做的Web Service供C++ Builder客户端的程序调用。由于两个程序的编码不同,导致C++ Builder向Web Service传递的中文字符串都变成了乱码。就是在C++ Builder中指定字符串以utf8编码格式发送,也是乱码。但是从Web Service中发送出去的中文字符串在C++ Builder中接收没有问题。

请帮忙!解决C++ Builder发送到Web Service的乱码问题,谢谢!
...全文
171 21 打赏 收藏 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
7710703 2003-04-10
  • 打赏
  • 举报
回复
由于时间比较紧,昨天我这样实现的:
在C++ Builder中发送的字符串先转换成utf8编码格式,然后将这个字符串转换成字节数组,在.net的Web Service中用字节数组接收,然后再把这个字节数组转换成unicode的字符串使用。
经测试,已经成功。代码如下:
[WebMethod]
public string HelloWorld(byte[] bb)
{
char[] cc=System.Text.Encoding.UTF8.GetChars(bb);
string s1=new string(cc);
FileStream fs=new FileStream("c:\\1.txt",FileMode.Create);
StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.UTF8);
sw.WriteLine(s1);
sw.Close();
fs.Close();
return s1;
}

今天又对C++ Builder发出的信息进行了拦截,发现了发出的xml信息竟然没有指定编码信息。我想着可能是C++ Builder的bug吧。现在解决办法如下:
在获得远程Web Service接口的函数里面加上这两条语句就完全ok了。
rio->Converter->Options<<soUTF8InHeader;//THTTPRIO rio;
rio->HTTPWebNode->UseUTF8InHeader=true;

呵呵,终于解决问题了,谢谢诸位,结贴!
小默说AI 2003-04-09
  • 打赏
  • 举报
回复
正在看soap协议
先前的
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
和编码方式无关,这个是用来指定soap格式的
--indicate the serialization rules used in a SOAP message

或者你把
HTTPReqResp1 的Content-Type的charset
和
"<?xml version=\"1.0\" encoding=\"utf-8\"?>
都修改为gb2312试试

小默说AI 2003-04-09
  • 打赏
  • 举报
回复
你试着改变
HTTPReqResp1的
Content-Type: text/xml; charset="utf-8"
7710703 2003-04-09
  • 打赏
  • 举报
回复
to dragontt(龙人) :

加了这个声明也是乱码啊。
helloqiner 2003-04-09
  • 打赏
  • 举报
回复
up
我用delphi调用c#写的Web Service也遇到相同的问题。关注
7710703 2003-04-09
  • 打赏
  • 举报
回复
to saucer(思归, MS .NET MVP):
我明白你的意思。但是我现在是在C++ Builder中接收Web Service的中文是没有问题的。只是差在Web Service接收中文这里。但是我把接收编码改成GB2312的话,在C++ Builder中好像无法转成这样的编码进行发送。如果换成UTF8的话,那就是Web Service的默认方式啊,他也是乱码啊。
小默说AI 2003-04-09
  • 打赏
  • 举报
回复
你在soap:Envelope 中加入这句声明试试
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
7710703 2003-04-09
  • 打赏
  • 举报
回复
to timmy3310(tim):
如果照你的方法做的话,但是在C++ Builder转换成base64字符串的时候也是非常麻烦的,因为C++ Builder字符所占的字节数和.net中字符所占的字节数不一样的长度啊,那在.net中转换的时候不会发生问题吗?如果还是按照一个编码格式(比如utf8)的话,那不就又非常麻烦了吗?
saucer 2003-04-09
  • 打赏
  • 举报
回复
试着改变web.config:

<configuration>
<system.web>
<globalization requestEncoding="GB2312" responseEncoding="GB2312"
uiCulture="zh-CN" culture="zh-CN" fileEncoding="GB2312" />

</system.web>

</configuration>


如用utf8发送,把requestEncoding改成UTF8
7710703 2003-04-09
  • 打赏
  • 举报
回复
to timmy3310(tim):
你所说的方法要比我说的那个传递数组是要好办得多了,不过是有点麻烦,我现在特别想在C++ Builder发送过来的时候就是正确的。不知还有没有其他的更好的办法,谢谢。
7710703 2003-04-09
  • 打赏
  • 举报
回复
to dragontt(龙人):
这是C++ Builder的代码:

HTTPReqResp1->URL="http://wjzhy/qamonitor/test.asmx";
HTTPReqResp1->SoapAction="http://tempuri.org/HelloWorld";
AnsiString DATA="<?xml version=\"1.0\" encoding=\"utf-8\"?>\
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\
<soap:Body>\
<HelloWorld xmlns=\"http://tempuri.org/\">\
<ss>";
DATA=DATA+Edit1->Text;
AnsiString footer="</ss>\
</HelloWorld>\
</soap:Body>\
</soap:Envelope>";
DATA=DATA+footer;
ShowMessage(DATA);
int ll=DATA.Length();
wchar_t *kk=new wchar_t[ll+1];
StringToWideChar(DATA,kk,ll+1);
AnsiString uuu=AnsiToUtf8(DATA);
int bb=HTTPReqResp1->Send(WideString(kk));
TStringStream *result=new TStringStream("");
HTTPReqResp1->Receive(bb,result);
ShowMessage(UTF8Decode(result->DataString));
timmy3310 2003-04-09
  • 打赏
  • 举报
回复
不同的系统之间传送字符串可能是会存在问题

不过你可以把字符串做一次Base64的编码,这样可以传送字符串本来的编码,再传送过程中不会被更改:

string str = "This is a string";
byte[] b = System.Text.Encoding.Default.GetBytes( str );

string base64Str = Convert.ToBase64String( b );

//专成Base64编码的字符串

b = Convert.FromBase64String( base64Str );

string str1 = System.Text.Encoding.Default.GetString( b );

//转回来

也就是说C++ Builder传递的时候,把字节数组编码成Base64的字符串在传递,Web Service这边解码后转成正确的字符串,这样是麻烦一点,不过这么小的运算不会降低更多的性能,但是会比较稳妥
小默说AI 2003-04-09
  • 打赏
  • 举报
回复
编码方式肯定没有问题
这个和你使用那个工具无关

现在你传参数的问题

你把C++ Builder中调用Web Service的代码片断贴出来
7710703 2003-04-09
  • 打赏
  • 举报
回复
to dragontt(龙人) :

其实我写的那个文本文件是个测试,实际上我是写到数据库里面的,但是在接收到这个字符串的时候就是乱码,叫我无法进行保存,就是以utf8格式写到文本文件里面的时候也是乱码。

在C++ Builder中用unicode编码发送到Web Service的时候也是乱码。
7710703 2003-04-09
  • 打赏
  • 举报
回复
应该是一样的。

我是这样测试的,在将同一个utf8格式的字符串的字节数组在.net和C++ Builder中分别进行转换,得到的是同一个字符串。这说明两者的编码格式应该是一样的。

既然这样,这个问题好像是有了解决办法,就是C++ Builder发送的时候转换成utf8字符串的字节数组,.net接收的时候再转换回来。但是这样是多么地麻烦和浪费时间啊。

我感到非常费解的是C++ Builder中传递字符串的时候指定的就是Web Seivice要求调用的utf8编码,可是在.net中为什么就都乱了呢?

还望timmy3310(tim)兄和后来的朋友帮忙想想办法,小弟这里谢谢了!
小默说AI 2003-04-09
  • 打赏
  • 举报
回复
你的文件是以什么编码保存的
你就在本地用C++ Builder写一个测试
读取你的文本
并打到一个文本中看看

然后再以unicode编码发送到Web Service试试
timmy3310 2003-04-09
  • 打赏
  • 举报
回复
这样,你可以测试一下
把.Net的Utf8的字符串的16进制编码与C++ Builder的编码比较一下看是不是一样,如果不一样那就证明格式不一样
7710703 2003-04-09
  • 打赏
  • 举报
回复
这样也是乱码。

现在的问题是不是C++ Builder发送的字符串的utf8格式在.net里面不能认识啊?所以变成了乱码,如果是这样的话,能不能有办法把这个utf8的字符串转成.net认识的unicode字符串?
timmy3310 2003-04-09
  • 打赏
  • 举报
回复
StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.UTF8);

改成这样行不行?
7710703 2003-04-09
  • 打赏
  • 举报
回复
呵呵,谢谢timmy3310(tim)兄!

因为在Web Service中指定的参数是string类型,所以我接收的时候,直接就是对这个string进行操作的。测试代码如下:
[WebMethod]
public string HelloWorld(string ss)
{
FileStream fs=new FileStream("c:\\1.txt",FileMode.Create);
StreamWriter sw=new StreamWriter(fs);

sw.WriteLine(ss);
sw.Close();
fs.Close();
return ss;
}

C++ Builder发送的字符串已经用AnsiToUtf8处理过,发过来的应该就是utf8的了。
加载更多回复(1)
内容概要:本文围绕永磁同步电机(PMSM)的矢量控制技术展开系统性研究,重点阐述了基于Simulink平台构建PMSM速度控制仿真模型的方法与实践。文章深入剖析了矢量控制的核心原理,包括Clarke变换与Park变换在内的坐标变换理论、磁场定向控制(FOC)策略、电流环与速度环构成的双闭环控制系统结构,以及空间矢量脉宽调制(SVPWM)技术在逆变器驱动中的应用。通过Simulink仿真实现完整的控制架构,对系统的动态响应特性进行了分析与验证,充分展示了该控制策略在调速性能、转矩响应和鲁棒性方面的优越表现。; 适合人群:具备电机控制、电力电子及自动控制理论基础,从事电气工程、自动化、新能源汽车、智能制造等相关领域研究与开发工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解PMSM矢量控制的理论体系与关键技术细节;②掌握利用Simulink进行电机控制系统建模、仿真与性能评估的方法;③为高性能电机驱动器的设计与优化提供理论依据和技术参考。; 阅读建议:建议读者结合Simulink软件动手复现仿真模型,重点理解各功能模块的参数设计与相互关联,关注PI控制器的整定过程与SVPWM模块的实现逻辑,并可通过改变负载或参考转速来观察系统响应,从而加深对控制策略的理解与掌握。
已经博主授权,源码转载自 https://pan.quark.cn/s/27084300a254 《面向iOS设备的MFi认证文档:Accessory Interface Specification R31的深入解析》 苹果的MFi(Made for iPhone/iPod/iPad)认证是一项针对第三方配件生产厂商的核心准则,其核心目标在于保障配件与苹果设备之间的互操作性和安全性。Accessory Interface Specification R31是此项认证的当前最新版本,系统性地阐述了开发适用于iOS平台配件所必须遵循的技术准则与具体要求。 1. **规范宗旨** 该技术文档的主要功能在于明确Apple认证配件应遵守的设计理念、功能特性以及性能指标,从而确保这些配件能够与iOS设备实现无障碍的协同作业。 2. **文档布局** 该规范被划分为多个章节,涵盖了设备适配性、测试流程、开发资源、参考模型、安全机制以及无线传输效能等多个维度,为生产厂商指明了明确的开发方向。 3. **适用范畴** 该规范适用于所有意图与iOS设备实现兼容的外部设备,无论其通过物理线路还是无线方式连接,均需满足其中的各项条件。 4. **必要条件、建议措施与授权管理** 配件设计者不仅必须遵循强制性的规范要求,同时亦需兼顾推荐的实施方法与权限配置,以期达到最优的用户交互体验和设备安全防护。 5. **预发布测试阶段** 文档中提供了开发者测试版与生产厂商测试版,使开发者在产品正式上市前能够进行充分的测试和改进。 6. **专业术语阐释** 该规范中界定了诸如“设备”、“配件”、“认证协处理器”等核心概念,旨在辅助读者准确理解文档内容。 7. **配件具体要求** - 基础设备兼容性:必须...

12,164

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧