Решил я на CodeGear RAD Studio 2009 (точней, не решил — а задание на работе такое) сделать прием XML файлика через IdHTTP. Возникла проблема с русскими символами.
сначала вообще проверил — что как работает — надыбал примерный план действий:
Все бы хорошо. но первая загвоздка — русские буквы не читаются. Информация передавалась в формате 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. Но если в запросе присутствуют не аски символы, то лучше использовать поток.
Ну а так — приятного аппетита!!!
А сайт на сегодня — ЖайНет — социальная сеть веб разработчиков Казахстана. Там можно найти много чего полезного и интересного. Жаль только что там про политику нельзя выражаться…
Ко мне пришли по этим поисковым фразам:
- evkzens (80)
- idhttp (50)
- delphi idhttp (22)
- delphi xml (16)
- idhttp post xml (16)
- delphi idhttp post передача мелкими пакетами (12)
- idhttp delphi (12)
- delphi дегеніміз не? (10)
...
TStringStream.Create('', TEncoding.UTF8);
...
U.WriteString(params[0]);
...
U.WriteString('&'+params[i]);
...