Поиск по этому блогу

понедельник, 20 июня 2011 г.

Delphi 2007 CGI приложение. Отправляем поток в формате utf-8

Этот код:
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 будет тот же, она же самостоятельно ничего не будет кодировать