delphi indy10 无法接收中文

作者&投稿:巨劳 (若有异议请与网页底部的电邮联系)
delphi indy10中文帮助~

indy10没有中文帮助,别浪费你宝贵的时间了,只能看英文的,有英文就不错了,英文的都介绍不全啊。

其时,个人觉得学编程有时要强迫自己学点英语,没办法,谁叫编程语言绝大部分都是老外写的呢。

建议全部使用AnsiString操作,应该就不会有问题了...
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Sendrec : TSendrec;
SendStr : AnsiString;
begin
if RichEdit2.Text '' then
begin
Sendrec.i := MAXDWORD;
Sendrec.j := MaxInt;
ZeroMemory(@Sendrec.Str, SizeOf(Sendrec.Str));
SendStr := AnsiString(Trim(RichEdit2.Text));
CopyMemory(@Sendrec.Str, PAnsiChar(SendStr), Length(SendStr));
RichEdit1.Lines.Add('你 ' + Myt);
RichEdit1.Lines.Add(Sendrec.str);
IdUDPServer1.SendBuffer(Edit1.Text, cPort, RawToBytes(Sendrec.Str, SizeOf(Sendrec.Str)));
RichEdit2.Clear;
Sendrec.Str := '';
end
else StatusBar1.Panels[0].Text := '发送消息不能为空';
end;

以我10年delphi经验来看,绝对不能用indy,这是一套华而不实,从头烂到脚的控件。编程的时候觉得还好,一旦实际使用,会发现根本无法胜任工作。只适合当当教学工具。

你要做发送和接收,给你推荐2个方法是我平常用的

1. 直接用api,网上有类似代码,阻塞模式很简单也很实用,要非阻塞就用线程。
2. 用自带的TServerSocket 和 TClientSocket,这套控件简单、实用。做简单的收发很有效。

中文乱码问题处理也很简单。
看你是用的什么编码类型,不要直接发送string,应该转换成连续内存块再发送。

Ansi、UTF8、Unicode,这些处理方式不一样
Ansi可以直接转换成pchar,
UTF8的话,要先用UTF8toString函数转换成Ansi,然后再转换成pchar发送
unicode也同样如此。

另外,你用的delphi版本也很重要,Delphi7以下的,只支持ansi,不用特别转换

从delphi2009开始,所有string都默认是unicode长度会有变化。

再者,我看到你的代码里面,发送和接收都没有实际长度,都是 -1,这是很不科学的做法。不能把长度交给系统去判断,这样只会是错误的。必须要提供实际的接收长度。只有这样才能避免被系统聪明的分包和组包。

encrystrhex() 加密,接收过来再解密。

找微软问问

转别人的
delphi2010以上版本字符串中的汉字用length获取的长度每个汉字是1,而delphi7中用length获取的长度每个汉字是2,参考如下一个newstr转换函数,通过字符串流StringStream,转换为正常显示汉字字符串。

function newstr(oldstr:string):string;
var
stream: TStringStream;
i:integer;
begin
stream := TStringStream.Create;
stream.Size := length(oldstr);
for I := 1 to length(oldstr) do
stream.Bytes[i-1] := ord(char(oldstr[i])) ;
newstr:=stream.DataString;
stream.Free;
end;