p.s. a jak INDY daje sobie radę w teście z ampersandem, czyli:
Nie tłumaczy tego adresu, ale z tym adresem wklejonym w pasek adresu to nawet przeglądarka Firefox sobie nie radzi, gdyż tłumaczy go na:
http://www.google.com/webhp?ie=CP1250 |
Jak widać brak kodowania w UTF-8 sprawia, że nie można wysłać zapytania ze znakami
&& gdyż są zastępowane znakiem zastępczym. Nawet w C++Builder 2010 INDY nie tłumaczy tych znaków na
%26, co więcej odkryłem, że funkcja
URLEncode musi zawierał cały adres, gdyż przy samym zapytaniu wyskakuje błąd. Właściwie to z nazwy funkcji powinienem wywnioskować, że służy ona do enkodowania całych adresów. Istnieje jednak inna funkcja
ParamsEncode:
- Kod: Zaznacz cały
// kod dla C++Builder 2010
#include <IdURI.hpp>
void __fastcall TForm1::Button3Click(TObject *Sender)
{
String Url = "http://www.google.com/search?q=&&ie=CP1250";
TIdURI *idUrl = new TIdURI("");
Edit1->Text = idUrl->ParamsEncode(Url); /* dla C++Builder poniżej wersji 2010: idUrl->ParamsEncode(__classid(TIdURI), Url); */
delete idUrl;
}
//---------------------------------------------------------------------------
Tłumacząca zarówno całe adresy jak i tylko same zapytania, ale i ta funkcja nie tłumaczy znaków zarezerwowanych, czyli: "-_;/?:@=&.". To ograniczenie w enkodowaniu może być czasami przeszkodą.
Idealnym rozwiązaniem była by wiec funkcja, która potrafiłaby oddzielić adres URL od zapytania. W mojej modyfikacji za punkt podziału przyjąłem
&p=, ale trzeba by zawrzeć w niej wszystkie możliwe punkty podziału. Modyfikacja przewiduje wystąpienie na początku łańcucha znaków frazy http, może jednak wystąpić sytuacja, gdy pojawi się adres bez tego przedrostka z całym adresem bez zapytania, lub z zapytaniem, funkcja zadziała prawidłowo.
Jak w
string zastąpić funkcje
AnsiPos i
SubString, bez dokonywania konwersji typu string na
AnsiString czy też
UnicodeString?