Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.16;
Скачать: CL | DM;

Вниз

Помогите с переводом JavaScript в Delphi   Найти похожие ветки 

 
Бакук ©   (2008-02-06 14:32) [0]

JavaScript:

var initCode = escape(dataForm.initialCode.value);
var secCode="";
for (i=0;i<initCode.length;i++)
secCode += String.fromCharCode(initCode.charCodeAt(i)^2);


Интересуют аналоги escape и fromCharCode в Delphi


 
Style ©   (2008-02-06 14:37) [1]

escape - urlEncode можно из IdGlobal.pas

fromCharCode - chr


 
Бакук ©   (2008-02-06 14:42) [2]

Не увидел UrlEncode/UrlDecode в Indy, хотя в интернете упоминается.


 
Style ©   (2008-02-06 14:43) [3]

хотя это не совсем urlEncode

Символы, числовые значения которых больше 255 будут представлены в формате %uxxxx.


 
Style ©   (2008-02-06 14:45) [4]

вырезка из IDGlobal


function URLEncode(const psSrc: string): string;
const
 UnsafeChars = " *#%<>"; {do not localize}
var
 i: Integer;
begin
 Result := ""; { do not localize }
 for i := 1 to Length(psSrc) do
 begin
   if (IndyPos(psSrc[i], UnsafeChars) > 0) or (psSrc[i] >= #$80) then
   begin
     Result := Result + "%" + IntToHex(Ord(psSrc[i]), 2); {do not localize}
   end
   else
   begin
     Result := Result + psSrc[i];
   end;
 end;
end;


только надо написать что если > 255 то переводить байт в юникод и записывать строку в формате %uXXXX.


 
Бакук ©   (2008-02-06 14:46) [5]

вот что нашел

http://www.soft32.ru/delphi.shtml?topic=syntax&title=encode_url


 
Style ©   (2008-02-06 14:49) [6]

<script>

document.write(escape("!@#$%^&*(){}[]=:/;?+\"""));

// %21@%23%24%25%5E%26*%28%29%7B%7D%5B%5D%3D%3A/%3B%3F+%27%22

</script>


заметь escape еще кодируют все вот эти символы

кроме

@*/+


 
Style ©   (2008-02-06 14:51) [7]


> http://www.soft32.ru/delphi.shtml?topic=syntax&title=encode_url


не могу посмотреть, прокси не пускает ;)


 
Style ©   (2008-02-06 15:28) [8]

в общем что-то вроде этого должно быть

function escape(const psSrc: widestring): string;
const
 UnsafeChars = "!#$%^&(){}[]=:;?\"+#39+"""; {do not localize}
var
 i: Integer;
begin
 Result := ""; { do not localize }
 for i := 1 to Length(psSrc) do
 begin
   if (Pos(psSrc[i], UnsafeChars) > 0) or (psSrc[i] >= #$80) then
   begin

     if (psSrc[i] >= #$255) then
     begin
     Result := Result + "%u" + IntToHex(Ord(psSrc[i]), 4); {do not localize}
     end
     else
     Result := Result + "%" + IntToHex(Ord(psSrc[i]), 2); {do not localize}
   end
   else
   begin
     Result := Result + psSrc[i];
   end;
 end;
end;


 
clickmaker ©   (2008-02-06 15:29) [9]


> "!#$%^&(){}[]=:;?\"+#39+"""; {do not localize}

а как это можно локализовать? o)


 
Style ©   (2008-02-06 15:54) [10]


> а как это можно локализовать? o)
>


это комментарий из idGlobal.pas
я сначала за копипастил функцию URLEncode(const psSrc: string): string;
затем переделал.

Так что все вопросы к Indy)


 
хам   (2008-02-06 15:56) [11]

> [10] Style ©   (06.02.08 15:54)
> Так что все вопросы к Indy)

Все вопрос ы к яндексу.


 
Style ©   (2008-02-06 16:25) [12]


> Все вопрос ы к яндексу.


нет, в данном случае именно к Indy.
Хотя как я понимаю, //{do not localize}  говорит о том что если не аккуратно
закопипастить, то могут в UnsafeChars = " *#%<>"; измениться коды перечисленных символов. Хотя не понятно на какой такой язык надо локализовать чтобы данные символы действительно изменились. 8-)


 
clickmaker ©   (2008-02-06 16:38) [13]

разве что вместо $ и # подставить р и № o)


 
Бакук ©   (2008-02-06 16:44) [14]

JavaScipt:

for (i=0;i<initCode.length;i++)
secCode += String.fromCharCode(initCode.charCodeAt(i)^2);


Delphi:
 for i := 0 to Length(AInitCode) do
   AResult := AResult + Chr(Ord(AInitCode[i]) * Ord(AInitCode[i]));


Где я ошибся?


 
clickmaker ©   (2008-02-06 16:45) [15]

Length(AInitCode) - 1
или High(AInitCode)


 
Бакук ©   (2008-02-06 16:45) [16]

Не так скопировал.


>   for i := 1 to Length(AInitCode) do
>     AResult := AResult + Chr(Ord(AInitCode[i]) * Ord(AInitCode[i]));
>
>


 
Бакук ©   (2008-02-06 16:47) [17]

Вход: Hello, world!

В жаваскрипте: Jgnnm"02umpnf"03
У меня: @Щђђ!


 
Style ©   (2008-02-06 16:57) [18]


>  for i := 0 to Length(AInitCode) do
>    AResult := AResult + Chr(Ord(AInitCode[i]) * Ord(AInitCode[i]));
> Где я ошибся?


Ну вопервых в string первый символ символ - это 1

во вторых - в функции Chr входной параметр типа Byte

function Chr(X: Byte): Char;

У тебя как видно получается код больше чем 255.
Значит нужно уже использовать widechar
а AResult должен быть типа widestring;

т.е. наверное так

Aresult: widestring;

for i := 0 to Length(AInitCode) do
   AResult := AResult + widechar(Ord(AInitCode[i]) * Ord(AInitCode[i]));


 
Style ©   (2008-02-06 16:58) [19]

про цикл забыл!
Aresult: widestring;

for i := 1 to Length(AInitCode) do
  AResult := AResult + widechar(Ord(AInitCode[i]) * Ord(AInitCode[i]));


 
Бакук ©   (2008-02-06 16:58) [20]

Хм.... ^ это не степень а XOR


 
Style ©   (2008-02-06 17:00) [21]


> Хм.... ^ это не степень а XOR
>


не думал что так считается степень
Ord(AInitCode[i]) * Ord(AInitCode[i])

:)


 
Бакук ©   (2008-02-06 17:03) [22]

Перемножение, т.е. 2 степень


 
Style ©   (2008-02-06 17:03) [23]

если xor тогда и widechar не нужен.


 
Бакук ©   (2008-02-06 17:04) [24]

И все таки

Яваскрипт возвращает jgnnm"02umpnf
Делфи возвращает jgnnm"umpnf

Подозреваю что проблема в Escape


 
Style ©   (2008-02-06 17:05) [25]


> Перемножение, т.е. 2 степень


да я что-то подумал  что ты разные числа перемножить пытаешься )

ЗЫ. смотрю в книгу вижу фигу - называется :)


 
Бакук ©   (2008-02-06 17:05) [26]

Сейчас это выглядит так:

 AInitCode := escape(AString);
 AResult := "";
 for i := 1 to Length(AInitCode) do
   AResult := AResult + Chr(Ord(AInitCode[i]) xor 2);


С пробелами вот проблема


 
Style ©   (2008-02-06 17:07) [27]

В UnsafeChars запятую еще добавь.


 
Style ©   (2008-02-06 17:08) [28]

и пробел


 
Style ©   (2008-02-06 17:11) [29]

а по хорошему посмотри вообще все символы которые escape кодирует

<script>

var i;
for (i = 0; i <= 255; i++)
{
 document.write(escape(String.fromCharCode(i)));
}

</script>


 
Бакук ©   (2008-02-06 17:42) [30]

Блин, все равно не те символы попадаются. Уже нашел в сети рекомендуемую функцию URL кодирования, но попадаются символы, отличные от оригинала.
А возможно ли выполнить
document.write(escape(ТЕКСТ)) и прочитать результат из делфи?


 
Style ©   (2008-02-06 17:56) [31]

вот так. проверил все символы от 0 до 255.

Сделал точно как в Escape только вот непонятно с русскими символами.

если их надо кодировать как %uXXXX то входным параметром должен быть widestring.

function escape(const psSrc: string): string;
const
 SafeChars =
 "*+"
+"-./"
+"0123456789"
+"@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"_abcdefghijklmnopqrstuvwxyz";
var
 i: Integer;
begin
 Result := "";
 for i := 1 to Length(psSrc) do
 begin
   if (Pos(psSrc[i], SafeChars) = 0) or (psSrc[i] >= #$80) then
   begin

     if (psSrc[i] > #255) then
     begin
     Result := Result + "%u" + IntToHex(Ord(psSrc[i]), 4);
     end
     else
     Result := Result + "%" + IntToHex(Ord(psSrc[i]), 2);
   end
   else
   begin
     Result := Result + psSrc[i];
   end;
 end;
end;


сейчас результат равен работе скрипта.


 
Бакук ©   (2008-02-06 18:01) [32]

И все равно нет.
Яваскрипт:
"0:dwlavkml"0:"0;"5@"2C-("2C"02("02hSwgp{"023

Делфи:
"0:dwlavkml"0:"0;"5@"2F"2C-("2F"2C"02("02hSwgp{"023


 
Бакук ©   (2008-02-06 18:02) [33]

Русских символов кстати нет


 
Style ©   (2008-02-06 21:06) [34]

Блин ну ты даешь.
У тебя код в Delphi и Jabascript"e отличается наличием %0D

угадай что это такое????

короче в Delphi это CRLF, т.е. #$0D#$0A , а в js только %0A
Я не знаю как там данные обрабатываются, но те данные которые приходят в функцию escape в js отличаются от тех которые приходят в escape delphi


 
korstin ©   (2008-02-07 03:47) [35]

обработай входную строку на наличие #13



Страницы: 1 вся ветка

Текущий архив: 2008.03.16;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.012 c
3-1193004721
dreamse
2007-10-22 02:12
2008.03.16
Подскажите как можно составить фильтр


11-1186028971
sunwise
2007-08-02 08:29
2008.03.16
Как дождаться исполнения консольного приложения? Подскажите.


6-1182316588
Dmitriy_010
2007-06-20 09:16
2008.03.16
COM порт через Ethernet


2-1203279731
Jimmy
2008-02-17 23:22
2008.03.16
Печать на принтере


15-1202310343
Пробегал...
2008-02-06 18:05
2008.03.16
Что за тип сервиса: SERVICE_WIN32_SHARE_PROCESS ?