Есть кусок кода который получает от 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 кодировку с которой и вылезли все вышеперечисленные проблемы.
Исходное сообщение которое не могу получить:
<errcode>101</errcode>
<errmsg>Регистрационный ключ уже используется на другом компьютере.</errmsg>
Здравствуйте, 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;
Здравствуйте, 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