как закодировать и декодировать url адрес

Предыдущая тема Следующая тема Перейти вниз

как закодировать и декодировать url адрес

Сообщение  electrik в Чт Ноя 01, 2012 4:37 pm

привет. вот есть url адрес:
"xxx.com/my music"
браузер отображает это так:
"xxx.com/my%20music"
после символа процент, идет код символа.
есть ли функции для кодирования и раскодирования таких url.
я могу и сам написать, но зачем городить вел, если он уже есть.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  electrik в Сб Ноя 03, 2012 7:19 pm

написал, но толку. функция InternetCanonicalizeUrl каноникализирует url так, что не безопасные символы кодируются типа:
%20, %2а.
фиг, только пробел, а русские буквы нет.
когда такую строку подсовываешь internetOpenUrl, выдает ошибку. естественно, ведь протокол http, способен понимать буквенно-цифровые символы, и знак подчёркивания _
функция InternetCrackUrl - разбирает url на составные части, протокол, имя хоста, порт,юзер, пароль, путь url, доп параметры.

короче, буду разбираться с другой функцией - UrlCanonicalize, а пока вот что я накатал.
неработает так как надо, оно только пробелы преобразует.

Код:

#include "windows.bi"
#include "win/wininet.bi"

function UrlEncode(byval url as string) as string
dim as URL_COMPONENTS uc
uc.dwStructSize = sizeof(uc)
uc.lpszScheme = null
uc.dwSchemeLength = INTERNET_MAX_SCHEME_LENGTH
uc.lpszHostName = null
uc.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH
uc.lpszUserName = null
uc.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH
uc.lpszPassword = null
uc.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH
uc.lpszUrlPath = null
uc.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH
uc.lpszExtraInfo = null
uc.dwExtraInfoLength = INTERNET_MAX_PATH_LENGTH
dim lenUrl as integer = INTERNET_MAX_URL_LENGTH
dim canonicalizedUrl as zstring * INTERNET_MAX_URL_LENGTH
InternetCanonicalizeUrl(url,canonicalizedUrl,@lenUrl,ICU_BROWSER_MODE)
if InternetCrackUrl(canonicalizedUrl , len(canonicalizedUrl ),0, @uc) then
return *uc.lpszScheme
end if
return ""
end function

print urlencode("http://xxx.com/search?c[section]=audio&c[q]=сергей жуков
sleep

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  trew в Вс Ноя 04, 2012 8:49 am

Я посмотрел на пурике встроенные функции URLDecoder() и URLEncoder() - они кустарные. Фред (разработчик PB) редко пишет свои функции взамен айпишным . Видать ничего путного среди API функций для этого дела не написали.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  electrik в Вс Ноя 04, 2012 5:32 pm

да, я уже понял, что winapi не катит. есть много заморочек.
кодировка, например в контакте она 1251, а на президент.рф- utf-8.
соответственно, при перекодировании url, надо знать эту кодировку. ее можно получить с заголовка html страницы.
чтобы закодировать урл, нужно его разбивать на части.
кодирование должно быть по крайней мере в два этапа.
кодирование пути- если в пути есть не безопасные символы, и кодирование параметров.
причем, например, знак & является разделителем параметров, и может быть внутри параметра.
какие бы небыли крутые браузеры, они не могут распознать не закодированный & , так как если попадается этот знак внутри параметра, он его понимает как разделитель.
пример:
зайдем на сайт vkontakte.ru, и введем следующее:
http://vk.com/search?c[section]=audio&c[q]=Abstract Vision & Elite Electronic - Sophia (Original Mix)
найдется только Abstract Vision, так как знак & понимается как разделитель параметров.
следовательно, совсем универсальную функцию для перекодирования целого url сделать не получится.
в моем случае, мне нужно передавать только параметры, соответственно:
http://vk.com/search?c[section]=audio&c[q]= оставляем, а параметр кодируем и склеиваем с этим куском url.

я тут задумал качалку с контакта замутить, вот и занялся этой фигнёй.
здохла отличная прога aga music, там при прослушивании мотать можно было.
работает воспроизведение через библиотеку bass, если натравить на прямую ссылку к mp3 файлу- уже проверено.
осталось, распарсить страницы, и выдернуть названия треков, потому , что имена файлов там выглядят как идентификаторы.
понятно, если интерфейс сменят, грохнется нафиг всё.
лучше так, можно по новой переписать.
а то лазить в контакт, и работать там с говорилками с их кривым интерфейсом как-то не очень удобно.
пока я не разобрался с ихним api, да и как-то нет нормальных примеров хотябы на c. по этому я и решил с web страниц выдирать.
буду писать как получится, потом можно будет всем помудрить. я парсеры особо не умею писать, буду писать как могу, отлавливая теги, которые относятся именно к названию трека, исполнителя.
потом при закачке буду в имя файла подсовывать сформированное имя типа:
Feel & Volmix - Dance 4 Life (Ronski Speed Remix).mp3
пока не проверил,, будет ли басс мотать при воспроизведении, или придется качать кусками, и скармливать bass.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  electrik в Пн Ноя 05, 2012 2:56 am

покумекав на счет http, выяснил следующее. у контакта и у президент.рф, не разные кодировки. браузер посылает серваку, какие он знает кодировки, в порядке приоритета,а сервак выдает ту, которую может.
инфа приходит в заголовок html файла, возможно и в ответах http- пока не понял.
Пойду дальше с wininet ковыряться, вроде есть там функции, для посыла http запросов.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  Замабувараев в Вт Ноя 13, 2012 7:28 pm

Однажды на оффоруме нашёл код для расшифровки интернет-кодировки. Необходим был для написания собственного http-сервера. Немножко обработал код.
Код:

   /'
   Расшифровываем интернет-кодировку
   '/
   Function UrlDecode(ByRef strUrl As String) As String
      ' Расшифровываем url-кодировку %XY
      Dim strTemp As String
      Dim iAcc As UInteger
      Dim iHex As UInteger
      For i As Integer = 1 To Len(strUrl)
         Dim c As UInteger = Asc(Mid(strUrl, i, 1))
         If iHex <> 0 Then
            iHex += 1  'decode hex code
            iAcc *= 16
            iAcc += (c - 48)
            If iHex = 3 Then
               c = iAcc
               iAcc = 0
               iHex = 0
            End if
         End if
         If c = 37 Then '37 = Asc("%")  'hex code coming ?
            iHex = 1
            iAcc = 0
         End if
         If iHex = 0 Then
            strTemp = strTemp & Chr(c)
         End If
      Next i
      Return strTemp
   End Function
Потом понадобилось то же самое, то только с юникодом. Но тут могут быть ошибки с утечками памяти. Исправьте, если что-то не так.
Код:

   /'
   Расшифровываем интернет-кодировку в юникод-строку
   '/
   Function WUrlDecode(ByVal strUrl As WString Ptr) As WString Ptr
      ' Расшифровываем url-кодировку %XY
      Dim strTemp As WString Ptr = Allocate(Len(strUrl) * SizeOf(WString) + 2)
      Dim iAcc As UInteger
      Dim iHex As UInteger
      For i As Integer = 1 To Len(*strUrl)
         Dim c As UInteger = Asc(Mid(*strUrl, i, 1))
         If iHex <> 0 Then
            iHex += 1  'decode hex code
            iAcc *= 16
            iAcc += (c - 48)
            If iHex = 3 Then
               c = iAcc
               iAcc = 0
               iHex = 0
            End if
         End if
         If c = 37 Then '37 = Asc("%")  'hex code coming ?
            iHex = 1
            iAcc = 0
         End if
         If iHex = 0 Then
            *strTemp = *strTemp & WChr(c)
         End If
      Next i
      Return strTemp
   End Function
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  electrik в Ср Ноя 14, 2012 1:04 pm

zamabuvaraeu - спасибо. погляжу. с раскодированием вродь проблемы у меня не было.
чтоб не было утечек, надо, наверное, узнать длину исходного урл, потом расчитать какой буфер нужен для раскодированного. думаю, что для случаев с урл, это не замедлит работу програмы.

теперь о написанном мною выше.

соответственно, при перекодировании url, надо знать эту кодировку.
надо передать в урл текст нужной кодировки, а функция кодирования должна делать следующее:
просматривать по байтно, не зависимо от кодировки. как попался не безопасный символ, он кодируется.- пока еще точно не уверен, буду пробовать. внятной инфы по этому ненашел.

если это параметр, тогда небезопасные символы кодируются в значениях параметров.
пример:
/login?email=qqq
знак = не кодируется, так как он присваивает значение параметру.
если знак равно встречается в значении параметра, он кодируется.


следовательно, совсем универсальную функцию для перекодирования целого url сделать не получится.
не правильно сказал. точнее говоря, не все ошибки можно отследить. урл изначально должен передаваться функции в правильном виде. если передается криво- это уж юзер или программер кривой.
функция urlencode должна кодировать те символы, кодорые неявляются управляющими. если же в значениях параметров есть символы, которые в урл считаются управляющими, мы зарание сами должны закодировать значение параметра, а потом передавать в url.
пример:
http://xxx.com/search?value=drum&bass
если такое передать функции urlencode, она ни чего не перекодирует, так как знак & является разделителем параметров.
соответственно, надо написать еще одну функцию, для кодирования параметров. пусть она будет такая:
function encodeparam(byval param as string) as string
теперь, чтоб в инет передать правильный url, будет так:
a=urlencode("http://xxx.com/search?value=")
a&=encodeparam("drum&bass")

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  electrik в Чт Ноя 15, 2012 12:20 am

люблю википедию, но сразу на этот счет не залез:
http://rootea.ru/url.htm
в принципе, как я и говорил по поводу кодирования, так и есть. строка, если надо, конвертится в utf-8, а потом по байтово не безопасные символы закодируются в шестнадцатиричные значения, перед которыми ставиться %.
кодировка зависит от того, которую вам предложил сервак.

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  electrik в Вс Ноя 18, 2012 2:58 am

ух, надоело все - изобретение велосипеда. нашел я во FreeBasic, заголовочные файлы к libcurl.
вот что про нее пишут:

libcurl это свободная и простая в использовании клиентская библиотека по передачи данных по URL, она поддерживает DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS,
IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET и TFTP. Также libcurl имеет поддержку SSL сертификатов, HTTP POST, HTTP
PUT, FTP загрузку, HTTP form загрузку, proxy, cookies, user+password авторизацию (Basic, Digest, NTLM, Negotiate, Kerberos), докачивания файлов, http прокси
туннелирования и многого другого!

libcurl легко переносима, она собирается и работает на многих платформах, включая Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux,
UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS и остальные...

libcurl свободна, потокобезопасна, совместима с IPv6, функциональна, имеет хорошую поддержку, быстрая, тщательно задокументирована и уже используется во
многих известных, крупных и успешных компаний и в многочисленных приложениях.

я даже нашол сайтец, где занимаются переводом справки на русский:
http://ru.libcurl.wikia.com/wiki/Libcurlru_%D0%B2%D0%B8%D0%BA%D0%B8
оф сайт:
http://curl.haxx.se
пример работы, к сожалению на c:
http://pblog.ru/?p=607
когда напишу пример на FreeBasic, или кто-ниьбудь напишет, создаем тему "библиотека libcurl".
в папке examples/network/curl, есть примеры работы, но там сделаны классы - для любителей процедурного программирования, оно будет сложновато.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как закодировать и декодировать url адрес

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения