我今天早上一直面临着一个问题,根本无法解决。我正在尝试从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取得任何成功。
如何使用正确的字符发送消息?
答案 0 :(得分:1)
DefStringEncoding
不是类属性,这就是您无法像尝试那样通过TIdIOHandler
类类型访问它的原因。它是一个实例属性,因此您需要一个指向TIdIOHandler
对象实例的指针。
在OnCommand
个活动中,您可以通过TIdIOHandler
媒体资源访问TIdCommand.Context.Connection.IOHandler
个对象。
如果您的所有命令和回复都使用UTF-8,那么最好在客户端连接到服务器时设置DefStringEncoding
一次。您可以通过OnConnect
属性在TIdContext.Connection.IOHandler
事件中执行此操作。
对于GIdDefaultAnsiEncoding
,TIdIOHandler
仅在DefStringEncoding
为零时才使用它,默认情况下不是{有一个TODO项目TIdIOHandler
使用{{ 1}}初始化GIdDefaultAnsiEncoding
时。