【问题标题】:Indy 10 EncodingIndy 10 编码
【发布时间】:2014-05-15 12:40:38
【问题描述】:

今天早上我遇到了一个问题,根本无法解决。我正在尝试从 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 方面没有取得任何成功。

我可以做些什么来发送带有正确字符的消息?

【问题讨论】:

    标签: delphi indy indy10


    【解决方案1】:

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

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

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

    至于GIdDefaultAnsiEncodingTIdIOHandler只在DefStringEncoding为nil时使用,默认情况下不使用(有一个TODO项可以让TIdIOHandler在初始化DefStringEncoding时使用GIdDefaultAnsiEncoding)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 2013-04-28
      • 1970-01-01
      • 2015-09-14
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多