1 (изменено: kefi, 2010-10-11 17:08:10)

Тема: VBS: URL Encoding при отправке формы в WinHttpRequest

Точнее формы , как таковой нет, она как бы подразумевается. Т.е. С помощью WinHttpRequest (ну или MSXML2.XMLHTTP) эмулируется отправка формы методом GET c application/x-www-form-urlencoded как это описано в WebFormClass v.3.0.

Так вот вопрос о том - как правильно URL кодировать в этом случае ?

Используемая в приведенной выше ссылке функция URLEncode вызывает сомнения.
Почему нельзя воспользоваться :

Set oScript = CreateObject("ScriptControl") ' New MSScriptControl.ScriptControl
oScript.Language = "JavaScript"
b = oScript.Eval("encodeURIComponent ('" & "M" & "')") ' encodeURIComponent encodeURI

?
encodeURIComponent дает кстати уже для , например ,русской М двухбайтовые юникодные значения URL кодирования %D0%9C вместо %CC от URLEncode("М").

Потом, непонятно для &, если он дожен использоваться как значение в передаваемых полях формы , вышеприведенные функции дают "%26" :

URLEncode("&")=oScript.Eval("encodeURIComponent ('" & "&" & "')")="%26"

, но RFC в этом случае говорит, что нужно использовать заменитель & -> & (См. раздел о использовании escape-последовательностей для обозначения амперсандов в значениях атрибутов URI.) Как же все правильно поступать ?

И вообще в вышеприведеной RFC ссылке сказано, что "Неалфавитные символы заменяются `%HH', знаком процента и двумя 16-ричными цифрами," , а encodeURIComponent ("М") дает не две, а 4 шестнадцатиречных цифры понимая заданный ей "М" как юникод симовл - чей-то запутался совсем ????

2

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

hex(asc("М"))

Я конечно далек от мысли... (с)

3

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

2 smaharbA > Так и я далек от мысли - нужно, чтобы кто-то недалекий от мысли откликнулся, а так - непонятно все остается.

4 (изменено: kefi, 2010-10-12 00:05:27)

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Вот сдается мне , что WebFormClass v.3.0. URLEncode должна быть такой :

Function URLEncode(Data)
Dim CharPosition, CharCode, oScript
Set oScript = CreateObject("ScriptControl") ' New MSScriptControl.ScriptControl
oScript.Language = "JavaScript"
URLEncode = ""
Data = Replace(Data, "&", "&")
For CharPosition = 1 To Len(Data)
 CharCode = AscW(Mid(Data, CharPosition, 1))
 URLEncode = URLEncode & oScript.Eval("encodeURIComponent(String.fromCharCode(" & CharCode & "))")
Next
end function

Для JavaScript : просто encodeURIComponent(кодируемая строка)

5

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

чем не устраивает нативный хекс ?

Я конечно далек от мысли... (с)

6

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

2 smaharbA > Вы же вобще непонятно что написали и не объяснили ничего.

7

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

For CharPosition = 1 To Len(Data)
    s=Mid(Data, CharPosition,1)
    CharCode = Asc(s)
    if ( charcode > 90 and charcode < 95 ) or charcode = 96 or charcode > 122 then
        URLEncode = URLEncode & "%" & right("0" & hex(CharCode),2)
    else
        URLEncode = URLEncode & s
    end if
Next
msgbox URLEncode

Или всеж таки вас интересует енкод в утф-8 ?

и к слову - обертку можно несколько изящнее пользовать

set this=oScript.Eval("this")
...
...this.encodeURIComponent(this.String.fromCharCode(CharCode))
Я конечно далек от мысли... (с)

8

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

2 smaharbA > Вы,видимо, так и не прочли первый пост или, точнее, ссылки в нем - там как раз и говорится о такой функции URLEncode, которая использует hex. Я же как раз засомневался в ее ( URLEncode ) правильности!
Ваши диапазоны , как и URLEncode, видимо неправильны, правильные диапазоны с т.зр. RFC 1738 1994 описаны тут: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
Но и по приведенной ссылке непонятно для кодов > 127 dec - их URL кодирование предлагается делать ПАРОЙ шестнадцатиричных цифр получая их из ASCII, в то время как , encodeURIComponent делает это минимум двумя парами 16-х цифр добывая их из UTF-8, Наверно, RFC 1738 от 1994 года устарел и надо пользоваться  encodeURIComponent , которая UTF-8 кодирует символы. Только вот , если сервер расчитывает получать данные с кодами > 127 как пару, а ему дадут по encodeURIComponent две (или более) пар 16-х цифр, то сервер неправильно поймет посылку.
   Вот этим я и хотел поделиться в первом посте. Кто может объяснить как-то иначе, - аргументы ,плз, в студию.

PS . За set this=oScript.Eval("this") спасибо, тогда использование encodeURIComponent можно упростить:

Function URLEncode(Data)
Set oScript = CreateObject("ScriptControl") ' New MSScriptControl.ScriptControl
oScript.Language = "JavaScript"
Set this = oScript.Eval("this")
URLEncode = this.encodeURIComponent(Data)
End Function

9 (изменено: Rumata, 2010-10-12 16:59:20)

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

RFC 1738 не менялся с 1994 года, но это не значит, что он устарел. Этот документ писался, когда Unicode только зарождался и, я полагаю, о его влиянии не было речи. Вот эта цитата (страница 2) по адресу http://www.ietf.org/rfc/rfc1738.txt говорит о том, как кодировать символы с кодами > 127. Этого достаточно, чтобы представить любой символ из любого алфавита и набора символов. URL-кодируя некоторый текст Вы ожидаете получить список триплетов в некой кодировке (866 или 1251), но это не так. URL как средство доступа к ресурсу  не знает об этих кодировках -- только Latin-1 (в переделах, описанных в RFC).

Octets must be encoded if they have no corresponding graphic
   character within the US-ASCII coded character set, if the use of the
   corresponding character is unsafe, or if the corresponding character
   is reserved for some other interpretation within the particular URL
   scheme.

Используйте нативные, документированные средства кодирования и будьте спокойны - современные серверы умеют обрабатывать нелатинские символы.

Амперсанд к данному RFC отношения не имеет -- его кодирование задокументировано в других документах - http://www.w3.org/MarkUp/html-spec/html … l#SEC9.7.1. Этот символ иммет особое значение (используется для представления сущностей) поэтому для корректного представления самого символа используется его сущность &amp;. Вы ни проиграете, и не выиграете, используя сущность вместо самого символа, и наоборот. Однако подстановка сущности будет правильнее.

Я так полагаю, VBScript не имеет своих средств URL-кодирования, коли Вы используете jscript-"инъекции"?

( 2 * b ) || ! ( 2 * b )

10 (изменено: alexii, 2010-10-12 17:50:30)

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

2 Rumata > Во-первых , RFC 1738 конечно, м.б. и не менялся, но но устарел - появились еще (мне известно два стандарта) вот последний RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax, Но не в этом суть. Я-то так и не понял Вашего мнения по этому вопросу :
1) .

URL-кодируя некоторый текст Вы ожидаете получить список триплетов в некой кодировке (866 или 1251), но это не так..

Непонятно, как Вы считаете нужно URLкодировать ? Я еще в первом посте привел ДВА способа, о каком говорите Вы - фиг поймешь, нельзя ясно изъясняться ?
2).

Я так полагаю, VBScript не имеет своих средств URL-кодирования, коли Вы используете jscript-"инъекции"?.

Что значит "не имеет", какие Вы имеете ввиду VBS cредства ? Изъясняйтесь яснее. Я же приводил два подхода ...

11

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

kefi, используйте BBCode.

12

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Я ж написал -- "Используйте нативные, документированные средства кодирования". Посмотрев Ваши примеры в первом сообщении я понял, что VBScript своих собственных encodeURIComponent/decodeURIComponent не имеет. То что Вы привели -- это я и назвал "инъекцией". Приведенные Вами подходы - неродные для VBScript.

Давайте по порядку. Если Вам необходимо передать несколько параметров, например, строка1, число10, строка2 и их соответствующие значения "длинная строка", 10, "строчка", то Вы должны сформировать строку запроса:

encodeURIComponent("строка1") & "=" & encodeURIComponent("длинная строка") & _
"&amp;" & _
encodeURIComponent("число10") & "=" & encodeURIComponent("10") & _
"&amp;" & _
encodeURIComponent("строка2") & "=" & encodeURIComponent("строчка")
( 2 * b ) || ! ( 2 * b )

13

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

кодирования URL как такогого не существует (с некоторым допущением), существует кодирование URI

Я конечно далек от мысли... (с)

14

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

2 alexii >   Не всегда есть под рукой браузер с BBCode фичами
2 Rumata > Вы опять о другом - зачем повторять по 100 раз то, что никто не оспаривает. Речь о том - как правильно URL кодировать - какой из нижеприведенных функций ?

Public Function EncodeURLComponentUtf8(ByVal Data) 
Dim CharPosition, CharCode, oScript
Set oScript = CreateObject("ScriptControl") ' New MSScriptControl.ScriptControl
oScript.Language = "JavaScript"
EncodeURLComponentUtf8 = ""
'Data = Replace(Data, "&", "&amp;") ' - это НЕ НУЖНО ?!
EncodeURLComponentUtf8 = oScript.Eval("this").EncodeURIcomponent(Data)
End Function

Public Function EncodeURLComponentAsc(ByVal Data) '
Dim CharPosition, CharCode
EncodeURLComponentAsc = ""
For CharPosition = 1 To Len(Data)           ' RFC 1738 dec1994 - еще нельзя было не US-ASCII в URL использовать
 CharCode = Asc(Mid(Data, CharPosition, 1)) ' <= 127 должно быть
 ' Для " " можно и "+" и %20
 Select Case CharCode                       ' http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
 'Case Is <= 127 ' совпадение со строчкой ниже, кроме ~ 126 %7E
 ' EncodeURLComponentAsc = EncodeURLComponentAsc & oScript.Eval("encodeURIComponent(String.fromCharCode(" & CharCode & "))")
 Case Is <= 32, 34 To 38, 43, 44, 47, 58 To 64, 91 To 94, 96, Is >= 123
  EncodeURLComponentAsc = EncodeURLComponentAsc & "%" & Right("0" & Hex(CharCode), 2)
 Case Else
  EncodeURLComponentAsc = EncodeURLComponentAsc & Chr(CharCode)
 End Select
Next
End Function
smaharbA пишет:

кодирования URL как такогого не существует (с некоторым допущением), существует кодирование URI

Вот если бы Вы объяcнили , какую существенную разницу Вы имеете ввиду, тогда это было значимым высказыванием.

15

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Давайте Вы не будете путать своими неопределенными вопросами и кратко и четко сформулируете Вашу проблему. Я Вам привел вполне корректный пример кодирования компонентов URL/URI и мне не понятно Ваше непонимание.

( 2 * b ) || ! ( 2 * b )

16

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

OFF:

kefi пишет:

2 alexii >   Не всегда есть под рукой браузер с BBCode фичами

У меня тоже. Иной раз и с Links приходится отправлять . Ничего, ручками.

Я не требую от Вас оформлять ссылку по полному заголовку (как я сделал в здесь), но обрамлять ссылку тэгом «url» считаю делом обязательным.

17 (изменено: kefi, 2010-10-12 23:04:30)

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Rumata пишет:

Давайте Вы не будете путать своими неопределенными вопросами и кратко и четко сформулируете Вашу проблему.

Неопределенно - это Вы изъясняетесь.
Куда уж проще объяснить - см. мой предыдущий пост, уже n-ный раз пытаюсь спросить : какую из приведенных двух функций будет правильно использовать для URL кодирования запросов , отравляемых при GET отправке формы (ну или  см. WebFormClass v.3.0. из первого поста - он взят, как конкретный пример) ?

18

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Вот столкнулся со следующим :
Объясните,плз, как все же правильно URL кодировать .

Не могу понять, отчего в примере ниже не работает encodeURIComponent , а работает двухцифровая %HH  URLкодировка :
' Вход на форум под логин/пароль ЮраДеточкин/123

var R = new XMLHttpRequest
R.Open ("POST", "http://yarportal.ru/index.html?act=Login&CODE=01", True)
R.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded")
R.send ("referer=http%3A%2F%2Fyarportal.ru%2Findex.html%3F&UserName=" +
        EncodeURLComponent("ЮраДеточкин") + "&PassWord=123&CookieDate=1")

Этот код НЕ СРАБОТАЕТ !

Но если вместо EncodeURLComponent("ЮраДеточкин") использовать  двухцифровую %HH  URLкодировку %DE%F0%E0%C4%E5%F2%EE%F7%EA%E8%ED ,
то сработает.
Может кто-ни ответить - почему ?

Та же история на yandex, наверно и в др.местах ...

19

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

кто-то может все-таки дать ответ - в какой кодировке текст дожен поступать на вход процедуры осуществляющей его  %-кодирование ?

20 (изменено: Xameleon, 2010-11-03 14:44:10)

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Я думаю как простое решение, Вам подойдёт такой вариант.

Function UrlEncode(Text)
    Dim i, char
    For i = 1 To Len(Text)
        char = Mid(Text, i, 1)
        If InStr(1, "0123456789abcdefghijklmnopqrstuvwxyz", char, 1) = 0 Then char = "%" & Hex(Asc(char))
        UrlEncode = UrlEncode & char
    Next
End Function

или если с учётом особенности кодировки пробела, то

Function UrlEncode(Text)
    Dim i, char
    For i = 1 To Len(Text)
        char = Mid(Text, i, 1)
        If InStr(1, "0123456789abcdefghijklmnopqrstuvwxyz", char, 1) = 0 Then 
            if char = " " Then 
                char = "+" 
            Else
                char = "%" & Hex(Asc(char))
            End if
        End if
        UrlEncode = UrlEncode & char
    Next
End Function
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

21

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

2 Xameleon > спасибо, что откликнулись, ибо топик вызван именно благодаря Вашим кодам, упомянутым в первом посте. Но вот url-кодирование там я как раз и не понял. Точнее, я понимаю их так, что работать Ваше url кодирование будет только для серверов , которые принимают windows-1251 кодировку, когда раскодируют url.

Объясню :

1) Ваш ответ выше говорит , что Вы не поняли моего вопроса от 2010-11-01 18:41:55.  Там я не спрашивал - КАК делать url-кодирование некоей процедурой, а спрашивал - в какой кодировке на ее вход должны поступать данные для url-кодирования (или точнее %-кодирования).

2) НА вход Вашей  UrlEncode поступает, как известно, строка типа WindowsUnicode1 (т.е. подмножество <=&#xFFFF;  Utf16 от текущей выполняющейся Windows)

Далее в UrlEncode она посимвольно  анализируется на допустимые символы - и возражений нет, когда выявленные т.о. допустимые символы Вы НЕ %-кодируете, а без изменения отправляете в результирующую строку (которая , конечно тоже WindowsUnicode1 типа).

Остальные символы Вашей исходной строки посимвольно  AnsiCode=Asc(Mid(Text, i, 1)) Преобразовываются в ANSI (т.е. windows-1251 по нашенски если) после чего этот Ansi код %-кодируется и обратно преобразовывается в WindowsUnicode1: "%"+Hex(AnsiCode).

В итоге на выходе имеем WindowsUnicode1 строку, состоящую из разрешенных символов и %hh-кодов. Теперь далее - эта строка при отправке методом send объекта MSXML2.XMLHTTP превращается в байты посылаемого URL, из которых каждый соотвествует одному символу url-кодированной строки
Пример :

wЮ  - UrlEncode("wЮ") ->  w%DE

Сервер примет эти 4 байта w%DE и  :
прежде всего их %-раскодирует(для этого процесса не надо знать ничего о кодировках) - получит 2 байта с кодами 77hex и DEhex и вот уже после :
ЕСЛИ ОН ЗНАЕТ что эти два байта в кодировке Windows-1251, то правильно их превратит в wЮ своей внутренней кодировки  и далее использует полученные данные для того , чтобы, скажем, найти путь к каталогу с файлами /wЮ/тар-тата/та-та.
А Если сервер не о windows-1251, а думает , скажем , что это пришло в UTF-8 кодировке, то в этом случае он после %-декодирования превратит коды 77hex и DEhex -> в один только w (т.к. после первого корректно превращенного байта в w он встретит DEhex байт , не имеющий в UTF-8 корректного символа) и соответственно при построении пути будет вместо нужного

/wЮ/тар-тата/та-та использовать /w/тар-тата/та-та.

Т.о. вывод :
Нужно учитывать (как - вопрос отдельный) то в какой кодировке данные принимаютсмя сервером и соответсвенно поступают на вход процедуры url-кодирования, которая в этом случае, конечно, сильно усложняется, вот если сервер хочет , чтобы это была UTF-8 , то - пожалйста, для этого можно использовать encodeURIComponent от JScript, но если он хочет koi-8, и более ничего , то тогда Ваша процедура не должна сработать, как и , впрочем, encodeURIComponent - нужна такая url-кодирования, которая бы учитывала кодировку, которую хочет сервер.
Вот собственно об этом я и справшивал в предыдущем своем посте - как понять , на какую кодировку следует рассчитвать в процедуре делающую url-кодирование , т.е. - как определить эту кодировку?

22

Re: VBS: URL Encoding при отправке формы в WinHttpRequest

Понял причину Вашего переживания. Сам сталкивался с этой проблемой. Честно скажу - полностью въехать во все условности кодирования не смог. Решал вопрос методом проб и ошибок. Функцию кодирования я использовал приведённую выше, а перед этим использовал ADODB.Stream для установки нужной кодировки. На вопрос

в какой кодировке на ее вход должны поступать данные для url-кодирования (или точнее %-кодирования).

мне сложно ответить. Не нашёл нигде подробной инфы. Скажу так - надо тестить ) Методом экспериментов найдём ответ.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !