Indy 10个插座。 TIdTCPServer组件。有一个客户端程序使用套接字连接到服务器程序。一切正常,通信没有问题,但是我无法从服务器向客户端发送带有特殊字符的字符串。发送这样的字符串时:
AContext.Connection.IOHandler.WriteLn ( ' Usuário não existe' ) ;
客户收到字符串:
usu?rio n?o existe
任何使用过此组件的人都知道如何正确设置编码并将此特殊字符串发送给客户端?
答案 0 :(得分:5)
默认情况下,Indy使用7位ASCII作为其字符编码(与各种Internet协议兼容)。要使用不同的字符编码,您需要:
在进行任何读/写之前设置IOHandler.DefStringEncoding
属性。默认情况下,基于字符串的I / O方法将使用此编码。
// note: use TIdTextEncoding.UTF8 if not using Indy 10.6 or later...
AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;
使用各种基于字符串的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);