Indy 10编码

时间:2014-05-15 12:40:38

标签: delphi indy indy10

我今天早上一直面临着一个问题,根本无法解决。我正在尝试从TIdCmdTCPServer向TIdTCPClient发送回复消息,但我得到'?'消息显示非ANSCII字符的字符。我发现Indy使用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会引发相同的错误。我没有使用GIdDefaultAnsiEncoding取得任何成功。

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

1 个答案:

答案 0 :(得分:1)

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

OnCommand个活动中,您可以通过TIdIOHandler媒体资源访问TIdCommand.Context.Connection.IOHandler个对象。

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

对于GIdDefaultAnsiEncodingTIdIOHandler仅在DefStringEncoding为零时才使用它,默认情况下不是{有一个TODO项目TIdIOHandler使用{{ 1}}初始化GIdDefaultAnsiEncoding时。