Показать сообщение отдельно
  #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. вопрос снят, разобрался
Ответить с цитированием