Решил я на 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]);
...