一个用 C# 调 DELPHI 写的 WebServer 的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 bundur
  • 开始时间 开始时间
B

bundur

Unregistered / Unconfirmed
GUEST, unregistred user!
调用功能一切正常, 只是返回提示信息在 C# 中显示乱码
为什么呀? 是代码页问题吗? 如何转换?
 
调用功能一切正常, 只是返回提示信息在 C# 中显示乱码
为什么呀? 是代码页问题吗? 如何转换?
 
很显然,这是编码识别的问题。
如果你的服务器的输出是gb2312编码,客户端应该类似如下的方式识别:
byte[] bytes=new byte[1024];
stream.Read(bytes, 0, 1024);
//stream指的是NetWorkStream
string result=Encoding.GetEncoding(936).GetString(bytes);
 
to: smokingroom
请再详细一点,比如我的 Webservice 上有一个方法叫
function GetName: widestring;
begin
result := 'WebService 互操作测试';
end;

在我的 C# 中如何写?
{
MyWebSrv ws = MyWebSrv();
string teststr = ws.GetName();
// 这里的 teststr 如果 Show 出来就是乱码了,这里该如何写?
MessageBox.Show(teststr);
}
 
1、你的WebService是用Delphi写的吗?由于用Delphi写比较麻烦,所以我没有测试,
但你可以用C#写一个asmx,用来测试的结果是没有问题的。
<%@ WebService language=&quot;C#&quot;
Class=&quot;MathService&quot;
%>
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
public class TestService: System.Web.Services.WebService
{
[WebMethod]
public string GetName()
{
return &quot;Hello,歡迎你!&quot;;
}
}
2、你的WebService与Client所在机器的语言选项是否一样?
按理来说,WebService端传递的是WideString,应该不会乱码的。
你可以试着以这样的方式来做测试:
服务器:
function GetName: TByteDynArray;
var
Str:string;
iLen:integer;
begin
Str:='WebService 互操作测试';
iLen:=Length(Str);
SetLength(Result,iLen);
Move(Str[1],Result[0],iLen);
end;
客户端:
byte[] bytes=obj.GetName();
string result=Encoding.GetEncoding(936).GetString(bytes);

//若服务器为简体,则CodePage为936,若服务器为繁体,则CodePage为950
 
to: smokingroom
经过测试使用 TByteDynArray 类型后转换,显示正常,但 WebService 的方法早已写成,而且很多原先 Delphi 项目已经使用,如何将 WideString 类型输出的方法,在 .NET 中得到正确的显示呢?
 
实在不行就用Base64吧,只是影响效率
 
把Web Service中THTTPRIO的控件里的所有关于UTF8的属性都设为True就可以了.
 
To: wenx,
Web Service 没有使用到 THTTPRIO 控件!
THTTPRIO 控件是客户端控件呀!
 
后退
顶部