使用TIdCmdTCPClient发送unicode命令

时间:2015-11-20 19:03:21

标签: delphi unicode delphi-xe indy indy10

我正在使用Delphi XE6和Indy 10

我想将一个Unicode字符串作为命令从TIdCMDTCPClient发送到TIdCMDTCPServer

我用IdCMDTCPClient组件的SendCMD方法发送命令,但收到的命令显示为'? '性格!

实际上我有一个Command(例如:“USER_REG”)和一些参数,参数是一个Unicode字符串(波斯字符)

我已经使用UTF8Encode函数将命令编码设置为IndyTextEncoding_UTF8或Encode命令,但是没有机会!

命令示例:

CMD := 'USER_REG#register_user(' + QuotedStr('محمود مهری') + ')';
TCPClient.SendCmd(CMD, -1, IndyTextEncoding_UTF8);

TCPClient.SendCmd(UTF8Encode(CMD), -1, IndyTextEncoding_UTF8);

如何将Unicode字符串作为命令发送?

谢谢......

1 个答案:

答案 0 :(得分:2)

TIdCmdTCPServerTIdCmdTCPClient并非旨在一起使用。如果您使用的是TIdCmdTCPServer,则应使用TIdTCPClient。如果您想使用TIdCmdTCPClient,那么至少不要使用其SendCmd()GetResponse()方法。 TIdCmdTCPClient使用内部读取线程从服务器接收消息。该帖子会干扰GetResponse()的阅读(SendCmd()内部调用GetResponse()。请改用客户端的IOHandler.WriteLn()方法,然后让TIdCmdTCPClient.CommandHandlers读取服务器的响应。

话虽如此,在实际发送中指定IndyTextEncoding_UTF8是正确的做法。您也可以设置客户端的IOHandler.DefStringEncoding属性。无论哪种方式,在这种情况下使用UTF8Encode()在Delphi 2009+中都是无用的,因为SendCmd()(和WriteLn())将UnicodeString作为输入,因此UTF-8编码{ {1}} RawByteString返回将由RTL转换回UTF-16 UTF8Encode()UnicodeString将在传输过程中再次重新编码回UTF-8。这是无用的开销。

在服务器端,您需要在读取时使用IndyTextEncoding_UTF8,以便正确解码传入的UTF-8编码命令。由于IndyTextEncoding_UTF8正在为您执行实际阅读,因此您必须将TIdCmdTCPServer分配给IndyTextEncoding_UTF8事件中的AContext.Connection.IOHandler.DefStringEncoding媒体资源。否则,将使用Indy的默认编码,默认情况下该编码为US-ASCII(可通过OnConnect变量配置)。这就是为什么您看到客户端的非ASCII字符转换为IdGlobal.GIdDefaultTextEncoding个字符的原因。 US-ASCII不支持?以上的字符。