Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
messad_el
13 / 13 / 2
Регистрация: 26.04.2013
Сообщений: 191
1

Как победить кодировку в Indy10?

06.02.2014, 10:29. Просмотров 4361. Ответов 3
Метки нет (Все метки)

Ребята сразу хочу сказать что эту тему пишу не для того что бы узнать, а потому что я уже знаю и хочу поделиться своими находками, точнее одной находкой.
Так я раздобрился потому что два дня у меня болела голова круглые сутки этой проблемой. Я умучил гугл запросами на эту тему пытался разобраться с документацией по ИНДИ, всё тщетно, видел что люди на форумах тоже озабочены этим вопросом и не находят вразумительного ответа, либо я находил ответы которые мне совершенно не подходят.

Вот мой код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  uri,id,comand,msg:String;
begin
 try
  uri:=ARequestInfo.URI;
  delete(uri,1,1);
  msg:='Здарова ';
{ AResponseInfo.ContentLanguage :='ru';
  AResponseInfo.CharSet := 'windows-1251';
  AResponseInfo.ContentEncoding := 'windows-1251';}
//закоментированы неудачные попытки решить проблему
  if length(uri)<=1 then
      AResponseInfo.ContentStream:=TFileStream.Create('index.html',fmOpenRead)
    else  begin
     if uri = 'server.exe' then
      begin
        id := ARequestInfo.Params.Strings[0];
        delete(id,1,3);
        memo1.Lines.Add('Просят прибор №'+id);
        if ARequestInfo.Params.Count = 2 then
         begin
          comand := ARequestInfo.Params.Strings[1];
          delete(comand,1,7);
          memo1.Lines.Add('-------Говорят:'+comand)
         end;
        AResponseInfo.ContentText:=(msg+id+'!');
      end else begin
        memo1.Lines.Add(uri+'<'+IntToStr(length(uri)));
        AResponseInfo.ContentStream:=TFileStream.Create(uri,fmOpenRead)
      end
    end
 Except
   AResponseInfo.ContentText:='Какая-то ошибка.';
 end;
end;
Теперь расскажу немного о сути своей проблемы. Пишу я на Delphi XE5 приложение где используется компонент IdHTTPServer который на GET запросы браузера выдаёт странички и на POST запросы будет выдавать данные по моему собственному внутреннему протоколу. Проблема разумеется заключалась в том что выдавал он страничку заменяя русские буквы на кракозябры в ней, а русские буквы в ответе не POST превращались в знаки вопроса. Половив снифером, да пообщавшись со своим сервером по телнету увидал я вот какую страшную вещь -
"POST /server.exe HTTP/1.0
Host: new_bd.ru
Content-type: application/x-www-form-urlencoded
Content-length: 8
Connection: Close

ty=12345
HTTP/1.1 200 OK
Connection: close
Content-Encoding: windows-1251
Content-Language: ru
Content-Type: text/html; charset=ISO-8859-1
Content-Length: 14
Date: Thu, 06 Feb 2014 06:01:24 GMT

??????? 12345!"
Я давай лазить по исходникам инди и узрел там:
Delphi
1
2
3
4
5
6
7
  // RLebeau 5/15/2012: for backwards compatibility. We really should
  // make the user set this every time instead...
  if ContentType = '' then begin
    if (ContentText <> '') or (Assigned(ContentStream)) then begin
      ContentType := 'text/html; charset=ISO-8859-1'; {Do not Localize}
    end;
  end;
и тут меня осенило
Delphi
1
AResponseInfo.ContentType := 'text/html; charset=windows-1251';
Я надеюсь мой пост кому-нибудь облегчит поиски.
З.Ы: Не знаю почему но первые два дня я пытался поменять у AResponseInfo свойство ContentType, но его не было почему-то, не знаю. //может невнимательность или бесы прятали его от меня
4
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 10:29
Ответы с готовыми решениями:

Indy10 на Delphi xe2
Здравствуйте. Есть у кого-нибудь примеры реализации чата и передачи файлов на Indy10, на...

indy10 определить версию прокси
дан список проксей, как определить socks4 или socks5 прокси?

Как победить ограничение Delphi на только моноширинные шрифты в окне редактирования кода?
Как победить ограничение Delphi на только моноширинные шрифты в окне редактирования кода? Например...

Bad Request при Post-запросе. W10,RAD XE3,Indy10
Добрый день, знатоки. Помогите в решении следующего вопроса: Есть некий веб-сервис со своим АПИ....

Как победить кодировку?
import MySQLdb con = MySQLdb.connect(host=&quot;127.0.0.1&quot;, user=&quot;user&quot;, passwd=&quot;password&quot;,...

3
Dangeranimal
13 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 1
06.09.2016, 09:57 2
Привет. Если используете httpserver и получаете параметры с помощью функции Memo1.Lines.Add('Params: ' +(ARequestInfo.Params.Text)); но видите иероглифы. Используйте функцию
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function convertir_utf8_ansi(const Source: string):string;
    var
       Iterator, SourceLength, FChar, NChar: Integer;
    begin
       Result := '';
       Iterator := 0;
       SourceLength := Length(Source);
       while Iterator < SourceLength do
       begin
          Inc(Iterator);
          FChar := Ord(Source[Iterator]);
          if FChar >= $80 then
          begin
             Inc(Iterator);
             if Iterator > SourceLength then break;
             FChar := FChar and $3F;
             if (FChar and $20) <> 0 then
             begin
                FChar := FChar and $1F;
                NChar := Ord(Source[Iterator]);
                if (NChar and $C0) <> $80 then break;
                FChar := (FChar shl 6) or (NChar and $3F);
                Inc(Iterator);
                if Iterator > SourceLength then break;
             end;
             NChar := Ord(Source[Iterator]);
             if (NChar and $C0) <> $80 then break;
             Result := Result + WideChar((FChar shl 6) or (NChar and $3F));
          end
          else
             Result := Result + WideChar(FChar);
       end;
    end;
При исполнение выглядит так
Delphi
1
Memo1.Lines.Add('Params: ' +  convertir_utf8_ansi(ARequestInfo.Params.Text));
0
messad_el
13 / 13 / 2
Регистрация: 26.04.2013
Сообщений: 191
06.09.2016, 10:32  [ТС] 3
Спасибо конечно. Но эта тема закрыта 500 лет назад)
0
Cyborg Drone
06.09.2016, 19:24     Как победить кодировку в Indy10?
  #4

Не по теме:

Цитата Сообщение от messad_el Посмотреть сообщение
тема закрыта
Неправда. Любая тема на данном форуме, если она не противоречит правилам форума, не закрывается и не удаляется никогда.
Цитата Сообщение от messad_el Посмотреть сообщение
500 лет назад
По правилам форума, это совершенно не важно. Тематические разделы данного форума общедоступны, и ответ в теме пишется не только лично для Вас, но и для всех участников форума.

Если в теме нет ответа, или ответ неполный, или есть иной вариант ответа, то даже рекомендуется опубликовать Ваш ответ в теме: может быть, он кому-нибудь пригодится. Также можно в любой теме задать уточняющий вопрос или попросить пояснить непонятные моменты.

Естественно, если поднимаешь тему из глубины веков, не стоит апеллировать к участникам обсуждения и к ТС: вполне возможно, и, скорее всего, так и есть, что они уже покинули форум. Лучше либо обращаться ко всем участникам форума, либо писать сообщение так, чтобы оно было безадресным.

Конечно же, не стоит поднимать тему "просто так": это чистой воды некрофилия.

Dangeranimal поступил правильно.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2016, 19:24
Привет! Вот еще темы с ответами:

Как "победить" кодировку?
Всем доброго времени суток! Есть текстовый файл, при просмотре FAR-ом все выглядит нормально...

Как победить IE 11?
Камрады, помогите, пожалуйста, победить IE 11. Говорю сразу - ламер, без специального образования,...

Как победить крокозябру?
Windows XP SP3 - при установке некоторых программ, например Nokia PC Suite или FL Studio сама...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru