Этот код:
1. Кодирует обычную строку в utf-8
2. Помещает эту строчку в поток (stream)
3. И пишет этот поток в ответ (Response)
В результате клиент в браузере получает строчку Это данные из потока ...
// отправляем поток в формате utf-8
procedure TWebModule2.WebModule2WebActionItem2Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
stream: TMemoryStream;
utf_string: UTF8String; // это строка в кодировке UTF-8
i: integer;
e_msg: string;
csv_txt: string; // это исходная строка
begin
Response.ContentType := 'text/plain; charset=UTF-8'; // тип контента
// создаем поток и пишем
stream := TMemoryStream.Create; // создаем поток
if Assigned(stream) then
begin
try
csv_txt := ' Это данные из потока ... ' ;
// перекодируем (в моем случае вполне себе сойдет)
utf_string := AnsiToUtf8(csv_txt);
i:=length(utf_string) * sizeof(UTF8String);
Stream.Write(utf_string[1], i); //пишем в поток
Stream.Position := 0;
if Assigned(stream) and (Stream.Size <> 0) then // если поток не пустой
begin
try
Response.ContentStream := stream; // передаем поток
except on e: exception do
begin
Response.Content := 'Ошибка ' + e.Message;
end; // on e
end; // try/e
end else
begin
Response.Content := utf_string; // передаем обычную строчку
end;
// отправляем клиенту
Response.SendResponse;
finally
Stream.Free; // освобождаем поток
end; // try/finally
end; // if есть поток
end;
Замечания по поводу кодирования/перекодирования в из UTF-8
Для простого случая, ака есть бд в кодировке win 1251 можно использовать
AnsiString
function Utf8ToAnsi(const S: UTF8String): string;
function AnsiToUtf8(const S: string): UTF8String;
А если действительно использовать юникод (с доп. экзотическими символами), то понадобится
WideString
function UTF8Decode(const S: UTF8String): WideString;
function UTF8Encode(const WS: WideString): UTF8String;
В принципе поток можно и не использовать, а писать в Response.Content
эффект для D2007 будет тот же, она же самостоятельно ничего не будет кодировать
1. Кодирует обычную строку в utf-8
2. Помещает эту строчку в поток (stream)
3. И пишет этот поток в ответ (Response)
В результате клиент в браузере получает строчку Это данные из потока ...
// отправляем поток в формате utf-8
procedure TWebModule2.WebModule2WebActionItem2Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
stream: TMemoryStream;
utf_string: UTF8String; // это строка в кодировке UTF-8
i: integer;
e_msg: string;
csv_txt: string; // это исходная строка
begin
Response.ContentType := 'text/plain; charset=UTF-8'; // тип контента
// создаем поток и пишем
stream := TMemoryStream.Create; // создаем поток
if Assigned(stream) then
begin
try
csv_txt := ' Это данные из потока ... ' ;
// перекодируем (в моем случае вполне себе сойдет)
utf_string := AnsiToUtf8(csv_txt);
i:=length(utf_string) * sizeof(UTF8String);
Stream.Write(utf_string[1], i); //пишем в поток
Stream.Position := 0;
if Assigned(stream) and (Stream.Size <> 0) then // если поток не пустой
begin
try
Response.ContentStream := stream; // передаем поток
except on e: exception do
begin
Response.Content := 'Ошибка ' + e.Message;
end; // on e
end; // try/e
end else
begin
Response.Content := utf_string; // передаем обычную строчку
end;
// отправляем клиенту
Response.SendResponse;
finally
Stream.Free; // освобождаем поток
end; // try/finally
end; // if есть поток
end;
Замечания по поводу кодирования/перекодирования в из UTF-8
Для простого случая, ака есть бд в кодировке win 1251 можно использовать
AnsiString
function Utf8ToAnsi(const S: UTF8String): string;
function AnsiToUtf8(const S: string): UTF8String;
А если действительно использовать юникод (с доп. экзотическими символами), то понадобится
WideString
function UTF8Decode(const S: UTF8String): WideString;
function UTF8Encode(const WS: WideString): UTF8String;
В принципе поток можно и не использовать, а писать в Response.Content
эффект для D2007 будет тот же, она же самостоятельно ничего не будет кодировать