Kodowanie tekstu -> "URLEncode"

dział ogólny

Kodowanie tekstu -> "URLEncode"

Nowy postprzez shycat » środa, 24 lutego 2010, 19:13

Witam, znacie moze jakas funkcje do kodowanie tekstu na tekst URL -> czyli np "ala ma kota" na "aka%20ma%20kota" ??
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez Cyfrowy Baron » środa, 24 lutego 2010, 19:20

Kod: Zaznacz cały
String tekst = "ala ma kota";
String url = StringReplace(tekst, " ", "%20", TReplaceFlags() << rfReplaceAll);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez shycat » środa, 24 lutego 2010, 19:24

Cyfrowy Barownie, z "StringReplace" wlasnie korzystalam, jednak kiedy przychodzi zamiana wszystkich znakow specjalnych, to trzeba by uzyc jej wiele razy StrinReplace, a i tak pewnie moznaby pominac jakis znak... dlatego zastanawiam sie czy jest do tego gotowa funkcja...
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez polymorphism » środa, 24 lutego 2010, 19:40

Kiedyś podałem podobną funkcję -> url_like_encode.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez shycat » środa, 24 lutego 2010, 19:55

Hm, kompletnie mi ta funkcja pod BCB 2006 nie dziala :/
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez polymorphism » środa, 24 lutego 2010, 20:46

Nie działa, czyli co? Nie kompiluje się, nie działa tak jak trzeba?

W zasadzie to trzeba by tam poprawić znaki, które powinny podlegać kodowaniu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez Cyfrowy Baron » czwartek, 25 lutego 2010, 11:27

Cyfrowy Barownie, z "StringReplace" wlasnie korzystalam, jednak kiedy przychodzi zamiana wszystkich znakow specjalnych, to trzeba by uzyc jej wiele razy StrinReplace, a i tak pewnie moznaby pominac jakis znak... dlatego zastanawiam sie czy jest do tego gotowa funkcja...


Gotowa funkcja nie pozamienia wszystkich znaków w jakiś cudowny sposób. Też będzie posiadać jakiś mechanizm, który będzie sprawdzał i podmieniał znaki. Mając funkcję StringReplace możesz stworzyć własną zmieniającą wszystkie znaki, np. coś takiego:

Kod: Zaznacz cały
String EncodeUrl(String &Url)
{
   String tabLitery[] = {" ", "ą", "Ą", "ę", "Ę", "ć", "Ć", "ł", "Ł", "ń", "Ń", "ó",
                       "Ó", "ś", "Ś", "ź", "Ź", "ż", "Ż"};
   String tabSymbole[] = {"%20", "%C4%85", "%C4%84", "%C4%99", "%C4%98", "%C4%87",
                        "%C4%86", "%C5%82", "%C5%81", "%C5%84", "%C5%83",
                        "%C3%B3", "%C3%93", "%C5%9B", "%C5%9A", "%C5%BA",
                        "%C5%B9", "%C5%BC", "%C5%BB"};

   for(unsigned int i = 0; i < ARRAYSIZE(tabLitery); i++)
   {
    Url = StringReplace(Url, tabLitery[i], tabSymbole[i], TReplaceFlags() << rfReplaceAll);
   }

   return Url;
}


Czas działania funkcji będzie krótki, gdyż tablice są niewielkie. Nie wiem czy tablice zawierają wszystkie znaki, ale zawsze można je uzupełnić.



Co do funkcji podanej przez polymorphism to oczywiście działa, ale trzeba umieścić typ string w przestrzeni nazw std i dodać bibliotekę string:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <string>
using namespace std;
string &url_like_encode(string &s1)
{
      string s2;
      char tmp[] = "%XX";

      for(string::iterator i = s1.begin(); i != s1.end(); ++i)
      {
        if(strchr("%,`\\ :",*i))
        {
          sprintf(tmp + 1,"%02X",*i);
             s2 += tmp;
        }
          else s2 += *i;
       }

       s1.swap(s2);
      return s1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  String Url = "http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie";

  Edit1->Text = String( url_like_encode(string(Url.c_str())).c_str() );
}
//---------------------------------------------------------------------------


Dla wygody w użyciu funkcji dodałem konwersję z Ansitring na string a potem ze string do AnsiString.
Ta funkcja jednak nie konwertuje podanego adresu prawidłowo, gdyż jako wynik otrzymamy:

http%3A//www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać%20przeznaczenie


jak widać dwukropek został zmieniony na %3A, litera ć pozostała niezmieniona, tylko spację funkcja zmieniła prawidłowo. Dzieje się tak dlatego, że funkcja url_like_encode została zaprogramowana do kodowania tekstu dla bazy SQL, a nie dla adresów url, chociaż nazwa funkcji wprowadza w błąd.



Używając zaproponowanej przeze mnie funkcji EncodeUrl uzyskasz prawidłowy adres:

Kod: Zaznacz cały
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  String Url = "http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie";

  Edit1->Text = EncodeUrl(Url);
}


w efekcie uzyskasz wynik:


http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszuka%C4%87%20przeznaczenie





Jeżeli dysponujesz pakietem INDY z biblioteką IdURI.hpp to możesz wykorzystać klasę TIdURI:

Kod: Zaznacz cały
#include <IdURI.hpp>

void __fastcall TForm1::Button5Click(TObject *Sender)
{
   String Url = "http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie";

   TIdURI *idUrl;

   Edit1->Text = idUrl->URLEncode(NULL, Url);
}
//---------------------------------------------------------------------------


Wynik:

http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszuka%E6%20przeznaczenie


Jak widać różni się to od tego co zwraca moja funkcja. Wynika to z tego, że moja funkcja prawidłowo interpretuje i enkoduje polskie znaki diakrytyczne, a funkja klasy TIdURI nie i podstawia znaki zastępcze. Niemniej obydwa adresy będą prawidłowe.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez polymorphism » czwartek, 25 lutego 2010, 12:23

Pisałem, że trzeba ją nieco zmodyfikować:
Kod: Zaznacz cały
string url_encode(const string &s1)
{
   string s2;
   char tmp[] = "%XX";

   for(string::const_iterator i = s1.begin(); i != s1.end(); ++i)
   {

      if((*i < 'a' || *i > 'z') && (*i < 'A' || *i > 'Z') &&
         (*i < '0' || *i > '9') && !strchr("-_",*i))
      {
         if(*i != ' ')
         {
            sprintf(tmp + 1,"%02X",(unsigned char)*i);
            s2 += tmp;
         }
         else s2 += '+';
         
      }
      else s2 += *i;
   }
   return s2;
}

Chyba zgodne ze specyfikacją podobnej funkcji w PHP.

Przykład:

Gotowa funkcja nie pozamienia wszystkich znaków w jakiś cudowny sposób.


CP1250

Gotowa+funkcja+nie+pozamienia+wszystkich+znak%F3w+w+jaki%9C+cudowny+spos%F3b%2E


UTF-8

Gotowa+funkcja+nie+pozamienia+wszystkich+znak%C3%B3w+w+jaki%C5%9B+cudowny+spos%C3%B3b%2E


(...) a nie dla adresów url, chociaż nazwa funkcji wprowadza w błąd.

Dlatego dodałem słowo like, co podkreśla, że idea jest taka sama jak w kodowaniu urlencode, choć nim nie jest.

Używając zaproponowanej przeze mnie funkcji EncodeUrl uzyskasz prawidłowy adres: (...)

Problem w tym, że tą funkcją nie powinieneś konwertować całych adresów, tylko jego fragmenty, które są na ogół parametrami zapytań GET lub POST.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez Cyfrowy Baron » czwartek, 25 lutego 2010, 13:39

Twoja funkcja url_encode wciąż działa nieprawidłowo, gdyż dla adresu:

http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie


zwraca wynik:


http%3A%2F%2Fwww%2Efilmweb%2Epl%2Fszukaj%3Fsource%3Dopensearch%26alias%3Dfilm%26q%3Doszuka%E6+przeznaczenie





Problem w tym, że tą funkcją nie powinieneś konwertować całych adresów, tylko jego fragmenty, które są na ogół parametrami zapytań GET lub POST.


To nie ma znaczenia, gdyż w adresie url nie mogą występować znaki zawarte w tablicach, ale i to można łatwo zrobić:

Kod: Zaznacz cały
String EncodeUrl(String &Url)
{
int x = Url.Pos("?");
String baseUrl = Url.SubString(1, x);
String getUrl = Url.SubString(x + 1, Url.Length());
String tabLitery[] = {" ", "ą", "Ą", "ę", "Ę", "ć", "Ć", "ł", "Ł", "ń", "Ń", "ó",
                  "Ó", "ś", "Ś", "ź", "Ź", "ż", "Ż"};
String tabSymbole[] = {"%20", "%C4%85", "%C4%84", "%C4%99", "%C4%98", "%C4%87",
                  "%C4%86", "%C5%82", "%C5%81", "%C5%84", "%C5%83",
                        "%C3%B3", "%C3%93", "%C5%9B", "%C5%9A", "%C5%BA",
                  "%C5%B9", "%C5%BC", "%C5%BB"};

for(unsigned int i = 0; i < ARRAYSIZE(tabLitery); i++)
{
   getUrl = StringReplace(getUrl, tabLitery[i], tabSymbole[i], TReplaceFlags() << rfReplaceAll);
}
Url = baseUrl + getUrl;
return Url;
}




CP1250 [...] UTF-8


To nic nie znaczy, konwersja adresu zapisanego w kodowaniu w ANSI do UTF-8 nie spowoduje pojawienia się odpowiednich znaków. Nie ma zastosowania, przy próbie konwersji ANSI do UTF-8 uzyskuję wynik:

http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie


Chyba, że chodzi Tobie o coś innego, ale ja tu nie widzę cudownego sposobu?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez polymorphism » czwartek, 25 lutego 2010, 13:58

Twoja funkcja url_encode wciąż działa nieprawidłowo (...)

No przecież pisałem, że tą funkcją nie konwertujesz całych adresów, bo jej zadaniem jest właśnie zakodowanie wszystkich znaków, które nie mogą występować w nazwach składników adresu url (np. spacja, dwukropek, slash, itp). To tak samo jak nazwy plików w windowsie, nie mogą one zawierać pewnych znaków, ale ścieżka już może (vide /\:?*).

Chyba, że chodzi Tobie o coś innego, ale ja tu nie widzę cudownego sposobu?!

Przykład z utf-8 ma pokazać, że można tą funkcją kodować tekst także w tym kodowaniu. W zasadzie to możesz tej funkcji dać jakiekolwiek dane, w jakimkolwiek formacie - to nie ma znaczenia. I tu tkwi ten cudowny sposób 8-)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez Cyfrowy Baron » czwartek, 25 lutego 2010, 14:04

Nie bardzo Ciebie rozumiem. Tutaj chodzi raczej o enkodowanie adresów URL, zapytań GET i POST o których sam wspomniałeś, a tymczasem dla podanego przeze mnie adresu zapytanie nie zostanie wykonane prawidłowo, gdyż enkodowane są takie znaki jak =, czy też &, więc akurat te znaki należałoby wykluczyć.

Jak Twoja funkcja poradzi sobie z takim adresem:

http://images.google.com/imgres?imgurl=http://www.fototube.pl/pictures/oep4b.jpg&imgrefurl=http://www.megawarez.eu/filmy/print:page,1,175087-oszukazh-przeznaczenie-4-final-destination-lektor.html&usg=__cj23pAb05s5Mx73IwpwpuadhjN4=&h=952&w=840&sz=222&hl=pl&start=2&itbs=1&tbnid=CGZbAqG1mg5p3M:&tbnh=148&tbnw=131&prev=/images%3Fq%3Doszuka%25C4%2587%2Bprzeznaczenie%26hl%3Dpl%26newwindow%3D1%26safe%3Doff%26tbo%3D1%26imgsz%3Dl%26tbs%3Disch:1



Co do tego cudownego sposobu, to zupełnie nie tym myślałem. Właściwie to ironizowałem, chcąc w ten sposób zwrócić uwagę, że tzw. gotowa funkcja również zawiera jakiś mechanizm.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez polymorphism » czwartek, 25 lutego 2010, 14:13

Tu masz co specyfikacja RFC1738 mówi:

2.1. The main parts of URLs
(...)
Scheme names consist of a sequence of characters. The lower case letters "a"--"z", digits, and the characters plus ("+"), period ("."), and hyphen ("-") are allowed. For resiliency, programs interpreting URLs should treat upper case letters as equivalent to lower case in scheme names (e.g., allow "HTTP" as well as "http").
(...)
The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme.



Jak Twoja funkcja poradzi sobie z takim adresem: (...)

Ty cały czas nie kumasz, że tą funkcją nie parsuje się adresów url!

(...) chcąc w ten sposób zwrócić uwagę, że tzw. gotowa funkcja również zawiera jakiś mechanizm.

Nie rozumiem, o jakiej gotowej funkcji mówisz?
Ostatnio edytowano czwartek, 25 lutego 2010, 14:16 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez Cyfrowy Baron » czwartek, 25 lutego 2010, 14:15

To jednak nie zmienia faktu, że adres enkodowany Twoją funkcją nie działa prawidłowo, czyli w przypadku podanego adresu nie wysyła zapytania. Podając adres do kontrolki WebBrowser trzeba go enkodować, a Twój kod nie enkoduje go prawidłowo. Po wklejeniu tak enkodowanego adresu do przeglądarki Firefox zapytanie również nie zostanie wykonane.



The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme.


Jak rozumiem te znaki są zarezerwowane (zastrzeżone) do specjalnych zastosowań, np. w zapytaniach GET i POST. Uważam więc, że nie powinny być enkodowane.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez polymorphism » czwartek, 25 lutego 2010, 14:35

Oj Baron, przeginasz. Do tego, co napisałem wyżej, dodam kod:
Kod: Zaznacz cały
string search_text = "Pomóżmy Baronowi zrozumieć url_encode";

string url = "http://www.google.com/search?q=" + url_encode(search_text) + "&ie=CP1250";

Mam nadzieję, że teraz zrozumiesz istotę tej funkcji.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kodowanie tekstu -> "URLEncode"

Nowy postprzez Cyfrowy Baron » czwartek, 25 lutego 2010, 14:50

Ale ty tłumaczysz tylko zapytanie do wyszukiwarki, a tutaj chodzi o enkodowanie adresów url a nie zapytań.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 36 gości

cron