Форум: "Прочее";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
ВнизПомогите с переводом 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.006 c