【问题标题】:Indy 10 TidTCPServer encoding charactersIndy 10 TidTCPServer 编码字符
【发布时间】:2025-12-30 07:15:07
【问题描述】:

Indy 10 插座。 TIdTCPServer 组件。有一个客户端程序使用套接字连接到服务器程序。一切正常,通信没有问题,但我无法从服务器向客户端发送带有特殊字符的字符串。发送这样的字符串时:

         AContext.Connection.IOHandler.WriteLn ( ' Usuário não existe' ) ;

客户端收到字符串:

usu?rio n?o existe

任何使用过这个组件的人都知道如何正确设置编码并将这个特殊字符串发送给客户端?

【问题讨论】:

    标签: delphi-xe2 indy10 tcpserver


    【解决方案1】:

    默认情况下,Indy 使用 7 位 ASCII 作为其字符编码(为了与各种 Internet 协议兼容)。要使用不同的字符编码,您需要:

    1. 在进行任何读/写之前设置IOHandler.DefStringEncoding 属性。然后,基于字符串的 I/O 方法将默认使用此编码。

      // note: use TIdTextEncoding.UTF8 if not using Indy 10.6 or later...
      AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;
      
    2. 使用各种基于字符串的 I/O 方法的可选 AByteEncoding 参数,包括 WriteLn()

      // note: use TIdTextEncoding.UTF8 if not using Indy 10.6 or later...
      AContext.Connection.IOHandler.WriteLn('Usuário não existe', IndyTextEncoding_UTF8);
      

    不用说,客户端在读取服务器数据时也必须使用等效编码,以便将传输的字节解码回 Unicode。例如:

    // note: use TIdTextEncoding.UTF8 if not using Indy 10.6 or later...
    Client.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;
    

    或者:

    // note: use TIdTextEncoding.UTF8 if not using Indy 10.6 or later...
    S := Client.IOHandler.ReadLn(IndyTextEncoding_UTF8);
    

    【讨论】:

    • 之后的结果:AContext.Connection.IOHandler.DefStringEncoding := TIdTextEncoding.ASCII; Usuario nao 存在后的结果:AContext.Connection.IOHandler.DefStringEncoding := TIdTextEncoding.ANSI; Usu?rio n?o 存在未解决。我应该使用哪种编码?
    • 谢谢你。我的错误是 2,客户端没有使用等效的编码来读取,其次我应该使用 UTF8 而不是 ASCII 或 ANSI。现在工作完美。再次感谢!!!!