String tekst = "ala ma kota";
String url = StringReplace(tekst, " ", "%20", TReplaceFlags() << rfReplaceAll);
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...
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;
}
//---------------------------------------------------------------------------
#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() );
}
//---------------------------------------------------------------------------
http%3A//www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać%20przeznaczenie |
void __fastcall TForm1::Button4Click(TObject *Sender)
{
String Url = "http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie";
Edit1->Text = EncodeUrl(Url);
}
http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszuka%C4%87%20przeznaczenie |
#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);
}
//---------------------------------------------------------------------------
http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszuka%E6%20przeznaczenie |
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;
}
Gotowa funkcja nie pozamienia wszystkich znaków w jakiś cudowny sposób. |
Gotowa+funkcja+nie+pozamienia+wszystkich+znak%F3w+w+jaki%9C+cudowny+spos%F3b%2E |
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.
Używając zaproponowanej przeze mnie funkcji EncodeUrl uzyskasz prawidłowy adres: (...)
http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie |
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.
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
http://www.filmweb.pl/szukaj?source=opensearch&alias=film&q=oszukać przeznaczenie |
Twoja funkcja url_encode wciąż działa nieprawidłowo (...)
Chyba, że chodzi Tobie o coś innego, ale ja tu nie widzę cudownego sposobu?!
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 |
2.1. The main parts of URLs |
Jak Twoja funkcja poradzi sobie z takim adresem: (...)
(...) chcąc w ten sposób zwrócić uwagę, że tzw. gotowa funkcja również zawiera jakiś mechanizm.
The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme.
string search_text = "Pomóżmy Baronowi zrozumieć url_encode";
string url = "http://www.google.com/search?q=" + url_encode(search_text) + "&ie=CP1250";
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość