swoją drogą, w tym kodzie robisz dokładnie to samo co ja, więc skąd ta pretensja?
The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme.
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.
Nie robię tego samego nie enkoduję znaków zarezerwowanych, czyli:
Gdybyś w swoim kodzie wykluczył te znaki nie miałbym żadnych zastrzeżeń.
#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() );
}
//---------------------------------------------------------------------------
Szkoda tylko, że nie obsługuje polskich znaków diakrytycznych.
Jeszcze one?! To co ta funkcja poza spacją będzie kodować?
znaki zastępcze np litera ć powinna mieć kodowanie %C4%87, podczas gdy u Ciebie ma %E6
#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() );
}
//---------------------------------------------------------------------------
Jeżeli w zapytaniu będę miał %E6 to wstawi mi znak zapytania '?', a jeżeli podam %C4%87 to wyświetli literę 'ć' (...)
To rozwiązuje mój problem z podawaniem pełnych adresów (...)
int p = sUrl.AnsiPos("&q=");
A co jeśli "&q=" nie będzie?
#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ć?
Nie problem. Już poprawiłem: (...)
Inaczej się z tą funkcją nie da.
A co jeśli "&q=" będzie na samym końcu, a przed tym będą inne parametry, wymagające konwersji?
#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;
}
#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;
}
//---------------------------------------------------------------------------
Nie spotkałem się jeszcze z takim przypadkiem.
Wystarczy INDY w wersji 10 i problem rozwiązany:
(...) obsługuje polskie znaki
http://www.google.com/search?ie=CP1250&q=oto%20taki%20przypadek
http://www.google.com/search?ie=CP1250 |
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();
W kodowaniu url to nie ma znaczenia, bo:
http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=gość" |
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości