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?