恳请高手帮忙,关于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的乱码问题,谢谢!
...全文
135 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;

呵呵,终于解决问题了,谢谢诸位,结贴!
dragontt 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试试

dragontt 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的默认方式啊,他也是乱码啊。
dragontt 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这边解码后转成正确的字符串,这样是麻烦一点,不过这么小的运算不会降低更多的性能,但是会比较稳妥
dragontt 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)兄和后来的朋友帮忙想想办法,小弟这里谢谢了!
dragontt 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)

12,162

社区成员

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

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