Кодировка текста TCP-клиента Indy 9
У меня есть приложение Delphi 7, использующее Indy 9, которое подключает TIdTCPClient
к TIdTCPServer
в приложении Delphi XE2 с использованием Indy 10.5.
Чтобы установить кодировку текста в UTF-8 в TIdTCPClient
в Indy 10 я могу использовать это:
TCPClient.IOHandler.DefStringEncoding := TIdTextEncoding.UTF8;
Как я могу установить кодировку текста в UTF-8 в Indy 9, так как нет DefStringEncoding
недвижимость в IOHandler
?
2 ответа
Indy 9 не поддерживает кодировки, а также не поддерживает Delphi 2009+ для Unicode. Все в Indy 9 предполагает / основано на AnsiString
только. Строки передаются как есть, как если бы они были необработанными байтовыми массивами.
Так что не отправляйте AnsiString
данные по соединению с использованием ANSI. Вы можете отправить / получить его как UTF-8. Вы просто должны кодировать / декодировать AnsiString
Данные вручную, вот и все. Indy 9 отправит в кодировке UTF-8 AnsiString
как есть, и читать в кодировке UTF-8 AnsiString
как есть. Затем вы можете кодировать / декодировать AnsiString
данные в / из UTF-8 по мере необходимости в вашем окружающем коде.
Например, ваш клиент Indy 9 может сделать это:
IdTCPClient1.WriteLn(UTF8Encode('Some Unicode String Here'));
...
S := UTF8Decode(IdTCPClient1.ReadLn);
Тогда ваш сервер Indy 10 может сделать это:
AContext.Connection.IOHandler.DefStringEncoding := TIdTextEncoding.UTF8;
...
S := AContext.Connection.IOHandler.ReadLn;
...
AContext.Connection.IOHandler.WriteLn(...);
Я не нашел способа установить кодировку UTF8 в Indy 9, затем решил следующее: зная, что кодировка по умолчанию в Indy 9 TCPClient является ANSI, я настроил кодировку в ANSI в приложении TCPServer, преобразовал все строки UTF8 в ANSI до соединения с TCPserver на TCPClient и все решено.