Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.02.2011, 11:27
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию получение страницы с доменом рф

столкнулся с ситлуацией при работе с idhttp.get, если страница на домене рф например http://нигма.рф/ то в браузерной строке так и отображается, а в снифере выглядит так Http://xn--80aforc.xn--p1ai , но при
Код:
idhttp.get('http://нигма.рф/');
такого не происходит, собственно, как сделать такой же принцеп получения страницы в indy
Ответить с цитированием
  #2  
Старый 14.02.2011, 13:15
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

punycode это называется.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 14.02.2011, 13:36
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

спс, нашёл функцию для работы с punycode, но как именно заведомо узнать русский домен стоит в
Код:
idhttp.get(''+FURL);
или нет, сама функция вот
Код:
function BuildACE(IDN:WideString):WideString;
var a, resturl:WideString;
    I:Integer;
    Liste: TStringlist;

function EncodeToACE(IDN:WideString):WideString;
const
      base         = 36;
      tmin         = 1;
      tmax         = 26;
      skew         = 38;
      damp         = 700;
      initial_bias = 72;
      initial_n    = 128;

Var Output, Input: WideString;
    I,n,bias,k, t, delta, h, b,m, m2,c,q :Integer;
    Aceneeded: Boolean;

function adapt(delta,numpoints:Integer; firsttime:boolean):Integer;
Var K:Integer;

begin
 if firsttime then delta := (delta div damp)
  else delta := (delta div 2);

 delta := (delta + (delta div numpoints) );
 k := 0;

 while (delta > ((base - tmin) * tmax) div 2) do
  begin
   delta := (delta div (base - tmin));
   k := (k + base);
  end;

result:= (k + (((base - tmin + 1) * delta) div (delta + skew)));
end;

function encodedigit(Value:Integer):Integer;
begin

 if Value < 26 then result:=Value + 22 + 75
  else
 if (Value < 36) and (Value > 25) then result:=Value +22
  else
 result:=Value + 22 +75 * 1 - 5;

end;

begin
   AceNeeded:=false;

   For I:=1 to length(IDN) do
    if ((IDN[i]) > #$80) then Aceneeded:=True;

   If not aceNeeded then
     begin
      result:=IDN;
      exit;
     end;

   n := initial_n;
   bias := initial_bias;
   output :='xn--';
   Input:=(IDN);
   delta := 0;
   h:=0;
   b:=0;

   For I:=1 to length(input) do
    if ( Char(Input[i]) < #$80  ) then
     begin
      Output:=Output+Input[i];
      inc(h);
      inc(b);
     end;

   if b > 0 then output:=output+Char(45);
    m:=maxint;
   while h < length(input) do
    begin
     m:=maxint;

     For I:= 0 to length(Input)-1 do
        begin
         m2:=ord(Input[I+1]);
         if (m2 < m) and (m2 >= n)  then m:=m2;
        end;

     delta := delta + (m - n) * (h + 1);
     n := m;

     for I:=0 to length(input)-1 do
     begin
      c:=ord(input[i+1]);
      if (c < n) or (char© < #$80 ) then inc(delta);
       if c = n then
        begin
         q := delta;
         k:=base;
         repeat
           if k <= bias then t := tmin
            else
           if k >= bias + tmax then t := tmax
            else t := k - bias;

           if q < t then break;
    Output := Output + Char(encodedigit ((t + (q - t) mod (base - t))));

           q := ((q - t) div (base - t));
           inc(k,base);
         until application.terminated;

         output := Output + Char(Encodedigit(q));
         bias := adapt(delta, h + 1,( h = b ));
         delta := 0;
         inc(h);
       end; // c=n
     end; // for loop

     inc(delta);
     inc(n);

   end; // while h<

result:=output;
end;

begin
Liste:=TStringlist.Create;
Liste.Delimiter:='.';
try
  a:=IDN;
  I:=Posex('/',a,9);
  resturl:=Copy(a,I,length(a));
  a:=Leftstr(a,i-1);
  a:=Stringreplace(a,'http://','',[]);
  liste.DelimitedText:=a;
  for I:=0 to liste.Count-2 do liste[i]:=EncodeToAce((liste[i]));
  A:='';
  for I:=0 to liste.Count-1 do A:=A+(liste[i])+'.';
  result:='http://'+Leftstr(A,length(a)-1)+resturl;
finally
 Liste.free;
end;
P.S. вопрос снят, разобрался

Последний раз редактировалось bulldog, 14.02.2011 в 21:55.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter