Получить UTF8 строку из TMemoryStream
От: Nilman Россия  
Дата: 06.02.12 10:56
Оценка:
Есть кусок кода который получает от PHP какой-то текст в UTF8.
Получаю данные вот таким образом:


   HTTPRecvBuffer: array [0..512] of char;

......................
         while True do
         begin
           // Check for data ready
           Retries:=0;
           repeat
             lSucc:= InternetQueryDataAvailable(hFile, BytesRead, 0, 0);
             if NOT lSucc then Sleep(SleepTime);
             Inc(Retries);
           until lSucc OR (Retries <= Attempts);
           // Read data
           InternetReadFile(hFile, @HTTPRecvBuffer, BufferSize, BytesRead);
           if BytesRead = 0 then break;
           FOutStream.WriteBuffer(HTTPRecvBuffer, BytesRead);
           ProgBytesReaded:=ProgBytesReaded+BytesRead;
           if Assigned(OnProgress) then
             OnProgress(Self, ProgBytesReaded, ProgTotalBytes);
           if FTerminate then Break;
         end;


из потока пытаюсь читать вот так:

function StreamToString(aStream: TStream): string;
var
 SS: TStringStream;
begin
 if aStream <> nil then
 begin
   SS := TStringStream.Create('');
   try
     SS.CopyFrom(aStream, 0);
     Result := SS.DataString;
   finally
     SS.Free;
   end;
 end else Result := '';
end;
......................
ShowMessage(StreamToString(FOutStream));
......................


Но в результате русского текста не вижу, корявые символы получаются..

вот ещё на всякий случай результаты снифа полученной инфы:

HTTP/1.1 200 OK\r\n
Date: Mon, 06 Feb 2012 10:21:39 GMT\r\n  
Content-Type: text/html\r\n
Connection: keep-alive\r\n
Content-Length: 151\r\n

Line-based text data: text/html
 
<errcode>101</errcode>\n
[truncated] <errmsg>\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206 \320\270\320\276\320\275\320\275\321\213\320\271 \320\272\320\273\321\216\321\207 \321\203\320\266\320\265 \320\270\321\201\320\277\320\276\320\273



Если урл вбить в адресной строке браузера и поставить вручную кодировку UTF8, то вижу именно то что отправил из PHP скрипта, т.е. с серверной частью проблем нет.

Добавлю ещё одно уточнение, код нормально работает с ANSI кодировкой, но сейчас возникла необходимость добавить мультиязыковую поддержку, поэтому переходим на UTF кодировку с которой и вылезли все вышеперечисленные проблемы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.