Получить 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 кодировку с которой и вылезли все вышеперечисленные проблемы.
Re: Получить UTF8 строку из TMemoryStream
От: Nilman Россия  
Дата: 06.02.12 11:03
Оценка:
Исходное сообщение которое не могу получить:

<errcode>101</errcode>
<errmsg>Регистрационный ключ уже используется на другом компьютере.</errmsg>
Re: Получить UTF8 строку из TMemoryStream
От: Pavlenty Россия http://vk.com/Pavel.Roshchin
Дата: 06.02.12 11:21
Оценка:
Попробуйте
ShowMessage(Utf8ToAnsi(StreamToString(FOutStream)));
Re[2]: Получить UTF8 строку из TMemoryStream
От: Nilman Россия  
Дата: 06.02.12 13:07
Оценка:
Здравствуйте, Pavlenty, Вы писали:

P>Попробуйте

P>ShowMessage(Utf8ToAnsi(StreamToString(FOutStream)));

Проблема решена:

function StreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');  // Вот здесь не хватало вторым параметром CP_UTF8
    try
      SS.CopyFrom(aStream, 0);
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;
Re: Получить UTF8 строку из TMemoryStream
От: Dimonka Верблюд  
Дата: 06.02.12 13:42
Оценка:
Здравствуйте, Nilman, Вы писали:

N>Есть кусок кода который получает от PHP какой-то текст в UTF8.

N>Получаю данные вот таким образом:
N>...
N>ShowMessage(StreamToString(FOutStream));
N>...
N>Добавлю ещё одно уточнение, код нормально работает с ANSI кодировкой, но сейчас возникла необходимость добавить мультиязыковую поддержку, поэтому переходим на UTF кодировку с которой и вылезли все вышеперечисленные проблемы.

А в каком месте ты перекодируешь UTF8 во что-то другое? Что-то я не увидел.
Ещё надо уточнить, какая версия Delphi, юникодовая или нет?

Читай про UTF8Decode в справке, а затем, если дельфи не юникодовый, читай вот это:

http://www.swissdelphicenter.ch/torry/showcode.php?id=1692
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.