我正在使用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字符串作为命令发送?
谢谢......
答案 0 :(得分:2)
TIdCmdTCPServer
和TIdCmdTCPClient
并非旨在一起使用。如果您使用的是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不支持?
以上的字符。