C# 通过SOCKET发送的中文,Delphi接收后变成???

drifer 2019-11-14 09:20:20
C#服务器端:

void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
{
string msg;
msg= "成功!";
session.Send(msg);
}

DELPHI客户端:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var s: Ansistring;
begin
s := Socket.ReceiveText;
Edit2.Text := s; // 这里s 返回问号 ???
end;


ReceiveText 返回的是 AnsiString,我想可能是编码的问题,C#的STRING默认是什么,DELPHI这边接收后要怎么转换?

function TCustomWinSocket.ReceiveText: AnsiString;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;
...全文
438 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xrbaa 2020-03-26
  • 打赏
  • 举报
回复
C#默认是Unicode,转换成同样的字符集就可以了。
dtboyi 2019-12-30
  • 打赏
  • 举报
回复
如果你的delphi 是xe版本。直接指定编码格式就行。 AContext.Connection.IOHandler.ReadString(IndyTextEncoding_8Bit); IndyTextEncoding_8Bit可以下以下几种格式: IndyTextEncoding_Default: IIdTextEncoding; IndyTextEncoding_OSDefault: IIdTextEncoding; IndyTextEncoding_8Bit: IIdTextEncoding; IndyTextEncoding_ASCII: IIdTextEncoding; IndyTextEncoding_UTF16BE: IIdTextEncoding; IndyTextEncoding_UTF16LE: IIdTextEncoding; IndyTextEncoding_UTF7: IIdTextEncoding; IndyTextEncoding_UTF8: IIdTextEncoding;
xionw 2019-11-18
  • 打赏
  • 举报
回复
不用管服务器是什么 你直接用 Tencoding.default.getstring(buf)就完事
drifer 2019-11-14
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
应该是你用的Delphi版本太老,2009之前的版本基本不支持unicode(除了WideString类型),换高版本就好了。
如果你非要用这一版,可以给TCustomWinSocket.增加一个重载的方法:

function TCustomWinSocket.ReceiveText: AnsiString; overload;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;

function TCustomWinSocket.ReceiveText: WideString; overload;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)) div SizeOf(WideChar));
end;

TCustomWinSocket的类声明部分也要加入重载方法的声明,然后把项目build一次(注意TCustomWinSocket的源文件要在查找路径中)

然后就可以:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var s: WideString;
begin
s := Socket.ReceiveText;
Edit2.Text := s;
end;


我用的是2010,应该也支持了。我重新定义ReceiveTex的返回值为String 或 WideString 都不行,变成所有都是乱码了(AnsiString 只是中文变成?号而已)
  • 打赏
  • 举报
回复
应该是你用的Delphi版本太老,2009之前的版本基本不支持unicode(除了WideString类型),换高版本就好了。
如果你非要用这一版,可以给TCustomWinSocket.增加一个重载的方法:

function TCustomWinSocket.ReceiveText: AnsiString; overload;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;

function TCustomWinSocket.ReceiveText: WideString; overload;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)) div SizeOf(WideChar));
end;

TCustomWinSocket的类声明部分也要加入重载方法的声明,然后把项目build一次(注意TCustomWinSocket的源文件要在查找路径中)

然后就可以:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var s: WideString;
begin
s := Socket.ReceiveText;
Edit2.Text := s;
end;
drifer 2019-11-14
  • 打赏
  • 举报
回复
引用 1 楼 戏言zare 的回复:
s:=PAnsiChar(AnsiString(Socket.ReceiveText));

没有作用。
戏言zare 2019-11-14
  • 打赏
  • 举报
回复
s:=PAnsiChar(AnsiString(Socket.ReceiveText));
  • 打赏
  • 举报
回复
只有中文乱码,可能发送端的字符编码是UTF-8

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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