RAD IdHTTP XML и utf-8 — как сделать винегрет и не подавится

RAD DELPHI utf8 и IdHTTP

RAD, utf8 и IdHTTP - все нормально работает

Решил я на CodeGear RAD Studio 2009 (точней, не решил — а задание на работе такое) сделать прием XML файлика через IdHTTP. Возникла проблема с русскими символами.

сначала вообще проверил — что как работает — надыбал примерный план действий:

  • указание параметров
  • передача параметров в пост
  • пост возвращает строку.
  • строку в XML.
  • включаем XML и парсим
  • Все бы хорошо. но первая загвоздка — русские буквы не читаются. Информация передавалась в формате utf-8.

    Шаманили долго. пришли к выводу — дописали в заголовке, что типа это кодировка win-1251 — вроде прошло.

    Да, все нормально работает. Но я живу в Казахстане. нужно, чтобы еще и казахские символы нормально отображались. но на некоторых компах стоит Tilmash (такая программка, которая портит виндовозные кодировки, чтобы винда специфические казахские символы отображала нормально в кодировке win-1251), который все портит.

    Итог — нужно что-то придумывать, дабы все читалось нормально — ибо в базе все в utf-8 записано и везде все должно нормально отображаться. А для тех, кто думает, что и так пойдет — тогда некоторые немецкие символы (умляуты — Umlaut) неправильно отображаются. В принципе, возможен и случай, когда в тесте будет всякая дребедень, которую можно нарисовать только благодаря utf-8.

    Полазил я по форумам — там все такие умные… Их главный козырь — «зачем это надо?». Хотя было видно, что не одного меня такой вопрос волновал.

    Не знаю откуда, но начальник узнал, ЧТО у IdHTTP куча вариантов функций utf-8 и одна из них — это возврат значений не в строку, а в поток. А вот и место откуда он это взял- ссылка Ну вот — мы начали копать в нужном направлении — оказывается, когда IdHTTP возвращает результат. он смотрит — если это строка, то он ее декодирует в виндовозную кодировку (хотя сам RAD работает с utf-8). А если это поток, то передает его без изменений — ЭВРИКА — то что нужно. осталось только показать реализацию.

    procedure TFormMain.SendHTTP(params:TStringList);
    // изначально к нам приходит массив параметров POST
    var
     i:integer;
     sStream, U : TStringStream;
     IdHTTP: TIdHTTP;
    begin
    try
    // создаем и инициализируем компонент IdHttp из библиотеки Indy приема и передачи
     IdHTTP:=TIdHTTP.Create(Self);
     IDHTTP.HTTPOptions := [];
     IdHTTP.Request.AcceptCharSet:='utf-8';
     IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    // создаем потоки приема (sStream) и передачи (U) параметров
     sStream:=TStringStream.Create;
     U:=TStringStream.Create();
    // загружаем параметры в поток
     if params.Count>0 then U.WriteString(UTF8Encode(params[0]));
     for i := 1 to params.Count - 1 do
     begin
      U.WriteString('&'+UTF8Encode(params[i]));
      // перед этим я убедился, что амперсандов больше нет
     end;
    // выполняем запрос. ipaddres - заранее известный адрес
     IdHTTP.Post(ipaddres, U,sStream);
    // Далее я гружу результат в XMLDocumentIn для последующей обработки.
    // Ну а Вы уже используйте по своему усмотрению и для своих нужд
    ...
    {
      try
        XMLDocumentIn.XML.Clear;
        XMLDocumentIn.LoadFromStream(sStream, xetUTF_8);
        XMLDocumentIn.Active:=true;
        for i:=0 to XMLDocumentIn.ChildNodes.Count-1 do
        begin
          ReadNodInfo(XMLDocumentIn.Node.ChildNodes.Get(i),0);
        end;
        XMLDocumentIn.Active:=false;
      except
      end;
    }
    ...
     finally
    // главное - подчищать за собой.
     IdHTTP.Free;
     end
    end;
    

    если код читали, то заметили, что передаваемоый и получаемый результаты передаются через потоки. Это обязательное условие. Изначально параметры в POST у меня приходили в виде TStringList. Но если в запросе присутствуют не аски символы, то лучше использовать поток.
    Ну а так — приятного аппетита!!!
    А сайт на сегодня — ЖайНет — социальная сеть веб разработчиков Казахстана. Там можно найти много чего полезного и интересного. Жаль только что там про политику нельзя выражаться…

     

    Ко мне пришли по этим поисковым фразам:

    JohnnySuperb

    Человек с разными склонностями и потребностями..

    One Comment

    Добавить комментарий для LEXASOFT Отменить ответ