Delphi 印地10编码

Delphi 印地10编码,delphi,indy,indy10,Delphi,Indy,Indy10,今天早上我遇到了一个问题,根本解决不了。我正在尝试将答复消息从TIdCmdTCPServer发送到TidCpClient,但收到的是“?”字符,其中消息显示非ANSCII字符。我发现印地使用ASCII编码,并试图改变它,但没有结果。代码如下: uses IdIOHandler, IdGlobal; procedure TDMSocket.DataModuleCreate(Sender: TObject); begin TIdIOHandler.DefStringEncoding:= TId

今天早上我遇到了一个问题,根本解决不了。我正在尝试将答复消息从TIdCmdTCPServer发送到TidCpClient,但收到的是“?”字符,其中消息显示非ANSCII字符。我发现印地使用ASCII编码,并试图改变它,但没有结果。代码如下:

uses IdIOHandler, IdGlobal;

procedure TDMSocket.DataModuleCreate(Sender: TObject);
begin
  TIdIOHandler.DefStringEncoding:= TIdTextEncoding.UTF8;
end;

procedure TDMSocket.IdCmdTCPServerLoginCommand(ASender: TIdCommand);
begin
  [...]
  InformaErros('Usuário ou senha inválidos', ASender);
  [...]
end;

procedure TDMSocket.InformaErros(Erro: string; ASender: TIdCommand);
begin
  ASender.Reply.Text.Text:= Erro;
end;
这样,我得到以下错误:

此处无法访问属性“DefStringEncoding”

尝试访问IdCmdTCPServer的IOHandler属性上的DefStringEncoding会引发相同的错误。而我在GidDefaultAnsiceoding上没有取得任何成功


如何使用正确的字符发送消息?

DefStringEncoding
不是类的属性,这就是为什么您无法像尝试的那样通过
TIdIOHandler
类类型访问它。它是一个实例属性,因此需要指向
TIdIOHandler
对象实例的指针

OnCommand
事件中,您可以通过
TIdCommand.Context.Connection.IOHandler
属性访问
TIdIOHandler
对象

如果您的所有命令和回复都将使用UTF-8,那么最好在客户端连接到服务器时设置一次
DefStringEncoding
。您可以通过
TIdContext.Connection.IOHandler
属性在
OnConnect
事件中执行此操作

至于
GidDefaultAnciencoding
TIdIOHandler
仅在
DefStringEncoding
为零时使用它,默认情况下不是这样(在初始化
DefStringEncoding
时,有一个TODO项要使
TIdIOHandler
使用
GidDefaultAnciencoding