StringList и кодировка. Извечные проблемы

dartveider13
Дата: 25.07.2019 08:52:40
Господа прошу помощи))) Осваиваю Indy... Гоняю SOAP-запросы и ответы через IdHTTP и IdTCP. С IdHTTP Все хорошо. Но вот данные по IdTCP я гоняю через StringList, загружая в него данные из MemoryStream, полученный из IdHTTP. Можно ли каким-нибудь образом по дефолту работать с StringList в кодировке UTF-8? Ответы клиенту с кириллицей выводятся в виде ?????. Или есть более элегантный метод?
wadman
Дата: 25.07.2019 09:00:41
Версия делфей какая? С какой-то версии потоки в конструкторе позволяют указывать кодировку.
dartveider13
Дата: 25.07.2019 09:03:48
wadman, да да юникодная XE, забыл указать
dartveider13
Дата: 25.07.2019 09:08:16
Для обмена сообщениями между веб-сервисом и клиентом используется самописная виндовая служба в которой есть IdTCP Client & Server. Для обращения к веб-службе IdHTTP Client. TCP Server получает от клиента запросы через StringList и отправляет ответы через него же.
dartveider13
Дата: 25.07.2019 09:10:32
Также есть отдельное приложение с TCP Client, которое общается с самописной службой. TCP Client на службе нужен для проброса запроса следующей такой же службе, если выставлен соответствующий режим
wadman
Дата: 25.07.2019 09:14:30
Если обе части самописные, то где-то что-то недокручено.
dartveider13
Дата: 25.07.2019 09:25:31
wadman, Я думаю, что это в части службы. В основном я сейчас смотрю на обработчик ошибок. Приведу эту часть:

procedure TSOAP_Transfer.IdTCPServerExecute(AContext: TIdContext);
var
 MS: TMemoryStream;
 SL: TStringList;
begin
 MS := TMemoryStream.Create;
 SL := TStringList.Create;
 try
   SL.Text := Acontext.Connection.ReadLN;

   // Дальше идет Case выбора режима. Возьму кусочек где идет обращение к веб-службе
   try
    IdHttp.Post(HTTP_WWW, SL, MS);
    SL.Clear;
    MS.position := 0;
    SL.LoadFromStream(MS);
    Acontext.Connection.Socket.WriteLn(SL.Text);  
   except
     on E:EIdHTTPProtocolException
     begin
     // Вот как раз сейчас инетерсует переброска нормального сообщения об ошибке клиенту. Здесь ???
    SL.Clear;
    SL.Text := E.ErrorMessage // Он в UTF-8
   Acontext.Connection.Socket.WriteLn(SL.Text);
     end;
   end;
 finally
  FreeAndNil(MS);
  FreeAndNil(SL);
 end; 
end;
wadman
Дата: 25.07.2019 10:26:49
dartveider13
Я думаю, что это в части службы.

До службы еще далеко. Достаточно на пустом приложении сэмулировать ситуацию и там-же бороться с проблемой. Это проще, чем службу отлаживать.
Zelius
Дата: 25.07.2019 10:58:32
wadman,

можно гонять данные UTF8 в бинарном виде, кодировать/декодировать их с помощью TEncoding.
Передаем
var
  Buffer: TBytes;
begin
  S := 'Это какой-то текст';
  Buffer := TEncoding.UTF8.GetBytes(S);
  SendBuffer(Buffer);
end;

принимаем
var
  Buffer: TBytes;
begin
  Buffer := ReceiveBuffer;
  MyStrLst.Text := TEncoding.UTF8.GetString(Buffer);
end;
dartveider13
Дата: 25.07.2019 11:01:21
Zelius, SendBuffer & ReceiveBuffer - это методы IdTCP?