
14.02.2011, 13:36
|
Начинающий
|
|
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
|
|
спс, нашёл функцию для работы с punycode, но как именно заведомо узнать русский домен стоит в
или нет, сама функция вот
Код:
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. вопрос снят, разобрался
|