Kodowanie tekstu -> "URLEncode"

dział ogólny

Re: Kodowanie tekstu -> "URLEncode"

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

A kto tak powiedział? Przeczytaj jeszcze raz pierwszy post. Tam nie ma nic na temat adresów URL, mowa jest tylko o tekście.

swoją drogą, w tym kodzie robisz dokładnie to samo co ja, więc skąd ta pretensja?
Ostatnio edytowano czwartek, 25 lutego 2010, 15:01 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:58

Adres url to też tekst, a pytanie brzmi jak zakodować tekst na tekst url, co wcale nie musi ograniczać się do enkodowania tylko zapytań.

Twoja funkcja nie zawsze się sprawdzi, np. przy użyciu kontrolki WebBrowser. Włączenie wyszukiwania w tej kontrolce na stronie spowoduje wysłanie zapytania (chodzi o nawigację w kontrolce jak w przeglaarce), jako wynik zostanie zwrócony cały adres strony, a nie tylko wynik zapytania. By enkodować całe zapytanie trzeba by je oddzielić od wyniku.
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 Cyfrowy Baron » czwartek, 25 lutego 2010, 15:10

swoją drogą, w tym kodzie robisz dokładnie to samo co ja, więc skąd ta pretensja?


Nie robię tego samego nie enkoduję znaków zarezerwowanych, czyli:
The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme.


Gdybyś w swoim kodzie wykluczył te znaki nie miałbym żadnych zastrzeżeń.

Moja tablica ma oczywiście wadę, gdyż nie zawiera wszystkich znaków. Mógłbym więc wzorując się na Twoim kodzie stworzyć tablicę wykluczającą znaki zarezerwowane i tłumaczyć resztę. Właściwe to wystarczy dodać taka tablicę do Twojego kodu i funkcja będzie działać w każdych warunkach, czyli nie tylko gdy zostanie jej przekazane tylko zapytanie, ale również wtedy gdy zostanie podany cały adres.
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, 15:37

Adres url to też tekst, a pytanie brzmi jak zakodować tekst na tekst url, co wcale nie musi ograniczać się do enkodowania tylko zapytań.

Owszem, ale na ogół to sprowadza się do kodowania parametrów przekazywanych w adresie url, tak jak pokazałem to w swoim przykładzie.

Twoja funkcja nie zawsze się sprawdzi, np. przy użyciu kontrolki WebBrowser.

Nie, ta funkcja zawsze się sprawdzi, tylko trzeba jej użyć w odpowiedni i zgodny z przeznaczeniem sposób. A co tam WebBrowser robi to inna sprawa, nie jestem wstanie tego sprawdzić, szczególnie, że nie mam kodu, na którym ją testujesz.

Nie robię tego samego nie enkoduję znaków zarezerwowanych, czyli:

Chodzi mi o to, że Twoja funkcja zaczyna właściwą pracę od momentu napotkania '?', czyli początku parametrów. Nie parsuje całego url-a.

Gdybyś w swoim kodzie wykluczył te znaki nie miałbym żadnych zastrzeżeń.

A dlaczego mam je wykluczać? Te znaki są znakami specjalnymi, tak samo jak znakiem specjalnym w ścieżkach windowsa jest "\", który nie może występować w nazwie pliku. Przeczytaj jeszcze raz całość fragmentu specyfikacji.
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, 15:51

Wylałeś potok słów, a wystarczy drobna modyfikacja:

Kod: Zaznacz cały
#include <string>
using namespace std;

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))
   {
      sprintf(tmp + 1,"%02X",(unsigned char)*i);
      s2 += tmp;
   }
   else s2 += *i;
}
return s2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
string Url = "http://www.filmweb.pl/szukaj?source=opensearch&alias"
                         "=film&q=oszukać przeznaczenie";

Edit1->Text = AnsiString( url_encode(Url).c_str() );
}
//---------------------------------------------------------------------------


I już funkcja sprawdza się w każdych warunkach. Można jej przekazać nie tylko zapytanie, ale również cały adres. Szkoda tylko, że nie obsługuje polskich znaków diakrytycznych.
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, 16:38

Szkoda tylko, że nie obsługuje polskich znaków diakrytycznych.

Jeszcze one?! To co ta funkcja poza spacją będzie kodować? :D

Za wszelką cenę próbujesz udowodnić swoją rację, choć odnoszę wrażenie, że nie wiesz do końca o czym piszesz. Przykładowo: co jeśli w zapytaniu google będę chciał sprawdzić co oznacza "&"?

Na tej funkcji wzorowałem się pisząc własną (chodziło o znaki). Co jak co, ale panowie od PHP chyba wiedzą co robią.
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, 16:43

Jeszcze one?! To co ta funkcja poza spacją będzie kodować? :D


Jak widzę nie zrozumiałeś. Chodzi o to, że Twoja funkcja podstawia pod polskie znaki - znaki zastępcze np litera ć powinna mieć kodowanie %C4%87, podczas gdy u Ciebie ma %E6



co jeśli w zapytaniu google będę chciał sprawdzić co oznacza "&"?

Fakt! O tym nie pomyślałem.
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, 16:54

znaki zastępcze np litera ć powinna mieć kodowanie %C4%87, podczas gdy u Ciebie ma %E6

A kto powiedział, że powinna mieć taki kod? E6 to kod w litery 'ć' w kodowaniu CP1250. Jak dasz tę literę w utf-8, to będziesz miał %C4%87 - proste.
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, 16:58

Jeżeli w zapytaniu będę miał %E6 to wstawi mi znak zapytania '?', a jeżeli podam %C4%87 to wyświetli literę 'ć' więc zapytanie będzie dokładne co w przypadku wyrazów zawierających dużo polskich liter może mieć duże znaczenie.
Gdy w wyszukiwarce filmweb.pl wpisze "oszukać przeznaczenie" to enkoduje mi literę 'ć' właśnie na %C4%87.



Kod: Zaznacz cały
#include <string>

using namespace std;

string url_encode(const String sUrl)
{
int p = sUrl.AnsiPos("&q=");

string baseUrl    = (sUrl.SubString(1, p + 2)).c_str();
const string s1   = (sUrl.SubString(p + 3, sUrl.Length())).c_str();

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))
        {
                sprintf(tmp + 1,"%02X",(unsigned char)*i);
            s2 += tmp;
        }
        else s2 += *i;
}
return baseUrl + s2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
String Url = "http://www.filmweb.pl/szukaj?source=opensearch&alias"
                         "=film&q=oszukać przeznaczenie";

Edit1->Text = AnsiString( url_encode(Url).c_str() );
}
//---------------------------------------------------------------------------


To rozwiązuje mój problem z podawaniem pełnych adresów, ale wciąż mam problem z polskimi literami.
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, 17:14

Jeżeli w zapytaniu będę miał %E6 to wstawi mi znak zapytania '?', a jeżeli podam %C4%87 to wyświetli literę 'ć' (...)

No ale to nie wina funkcji, tylko złego jej użycia 8-) Jeśli kody ANSI zaczynasz traktować jako kody unikodu, to prosisz się o problemy.

To rozwiązuje mój problem z podawaniem pełnych adresów (...)

Strasznie nabrudziłeś. Mieszasz std::stringa ze Stringiem, który jest chyba unikodowy. Zuo. Po co tak kombinować?

int p = sUrl.AnsiPos("&q=");

A co jeśli "&q=" nie będzie?

Baron, zostaw tę funkcję w oryginale.
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, 17:21

A co jeśli "&q=" nie będzie?


Nie problem. Już poprawiłem:

Kod: Zaznacz cały
#include <string>
using namespace std;

string url_encode(const String sUrl)
{
int p = sUrl.AnsiPos("&q=");
string s1;
string baseUrl = "";
if(p >= 0)
{
  baseUrl    = (sUrl.SubString(1, p + 2)).c_str();
  s1   = (sUrl.SubString(p + 3, sUrl.Length())).c_str();
}
else s1 = sUrl.c_str();

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))
        {
                sprintf(tmp + 1,"%02X",(unsigned char)*i);
            s2 += tmp;
        }
        else s2 += *i;
}
return baseUrl + s2;
}


Strasznie nabrudziłeś. Mieszasz std::stringa ze Stringiem, który jest chyba unikodowy. Zuo. Po co tak kombinować?


Inaczej się z tą funkcją nie da. Mam to w char, ale ze string też działa prawidłowo.
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, 17:58

Nie problem. Już poprawiłem: (...)

A co jeśli "&q=" będzie na samym końcu, a przed tym będą inne parametry, wymagające konwersji? 8-)

Próbujesz robić funkcję do wszystkiego, zupełnie niepotrzebnie.

Inaczej się z tą funkcją nie da.

No jak nie da?
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, 18:09

A co jeśli "&q=" będzie na samym końcu, a przed tym będą inne parametry, wymagające konwersji?


Nie spotkałem się jeszcze z takim przypadkiem.



Wystarczy INDY w wersji 10 i problem rozwiązany:

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

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

TIdURI *idUrl = new TIdURI("");

Edit1->Text = idUrl->URLEncode(__classid(TIdURI), Url);
delete idUrl;
}


Można wpisać tylko zapytanie, lub też cały adres, a w C++2010:

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

void __fastcall TForm1::Button3Click(TObject *Sender)
{

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

TIdURI *idUrl = new TIdURI("");

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


obsługuje polskie znaki, gdyż mamy tutaj zmienną UnicodeString.
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, 18:19

Nie spotkałem się jeszcze z takim przypadkiem.

http://www.google.com/search?ie=CP1250&q=oto%20taki%20przypadek 8-)

Wystarczy INDY w wersji 10 i problem rozwiązany:

No jeśli jest pod ręką, to wiadomo, ale jeśli nie ma, to dobrze wiedzieć, o co w tym wszystkim chodzi.

(...) obsługuje polskie znaki

W kodowaniu url to nie ma znaczenia, bo: http://www.google.com/search?q=%7A%61%6B%6F%64%6F%77%61%B3%65%6D+%77%73%7A%79%73%74%6B%69%65+%7A%6E%61%6B%69+%69+%6A%65%73%74+%67%69%74&ie=CP1250
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, 21:34

http://www.google.com/search?ie=CP1250&q=oto%20taki%20przypadek 8-)


Nic niezwykłego, moja modyfikacja zadziała prawidłowo. Nie wyróżnia sie wszak niczym szczególnym. Mamy tutaj:


http://www.google.com/search?ie=CP1250
&q=
oto taki przypadek




więc ten kod wszystko filtruje:

Kod: Zaznacz cały
int p = sUrl.AnsiPos("&q=");
string s1;
string baseUrl = (sUrl.SubString(1, p + 2)).c_str();
if(p >= 0)
{
  s1   = (sUrl.SubString(p + 3, sUrl.Length())).c_str();
}
else s1 = sUrl.c_str();


Nie rozumiem co chciałeś mi tym kodem udowodnić.



W kodowaniu url to nie ma znaczenia, bo:


Czasami ma znaczenie. Wysyłając np. zapytanie do wyszukiwarki filmweb.pl z hasłem: gość

http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=gość"


Bez polskich znaków zapytanie do wyszukiwarki będzie brzmiało go? i będzie ona wyszukiwać filmy zawierające frazę go. Podczas gdy przy kodowaniu polskich znaków zapytanie będzie brzmiało gość i wyszukiwarka znajdzie filmy z hasłem gość. Tak więc różnica będzie olbrzymia.
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

Poprzednia stronaNastę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 3 gości

cron