Please, how to decode an URL ?
Example:
Code: Select all
hello%2Fwx+forum ---> hello/wx forum
Code: Select all
hello%2Fwx+forum ---> hello/wx forum
Code: Select all
wxString FileUtils::DecodeURI(const wxString& uri)
{
static wxStringMap_t T = { { "%20", " " }, { "%21", "!" }, { "%23", "#" }, { "%24", "$" }, { "%26", "&" },
{ "%27", "'" }, { "%28", "(" }, { "%29", ")" }, { "%2A", "*" }, { "%2B", "+" },
{ "%2C", "," }, { "%3B", ";" }, { "%3D", "=" }, { "%3F", "?" }, { "%40", "@" },
{ "%5B", "[" }, { "%5D", "]" } };
wxString decodedString;
wxString escapeSeq;
int state = 0;
for(size_t i = 0; i < uri.size(); ++i) {
wxChar ch = uri[i];
switch(state) {
case 0: // Normal
switch(ch) {
case '%':
state = 1;
escapeSeq << ch;
break;
default:
decodedString << ch;
break;
}
break;
case 1: // Escaping mode
escapeSeq << ch;
if(escapeSeq.size() == 3) {
// Try to decode it
wxStringMap_t::iterator iter = T.find(escapeSeq);
if(iter != T.end()) {
decodedString << iter->second;
} else {
decodedString << escapeSeq;
}
state = 0;
escapeSeq.Clear();
}
break;
}
}
return decodedString;
}
wxString FileUtils::EncodeURI(const wxString& uri)
{
static std::unordered_map<int, wxString> sEncodeMap = {
{ (int)'!', "%21" }, { (int)'#', "%23" }, { (int)'$', "%24" }, { (int)'&', "%26" }, { (int)'\'', "%27" },
{ (int)'(', "%28" }, { (int)')', "%29" }, { (int)'*', "%2A" }, { (int)'+', "%2B" }, { (int)',', "%2C" },
{ (int)';', "%3B" }, { (int)'=', "%3D" }, { (int)'?', "%3F" }, { (int)'@', "%40" }, { (int)'[', "%5B" },
{ (int)']', "%5D" }, { (int)' ', "%20" }
};
wxString encoded;
for(size_t i = 0; i < uri.length(); ++i) {
wxChar ch = uri[i];
std::unordered_map<int, wxString>::iterator iter = sEncodeMap.find((int)ch);
if(iter != sEncodeMap.end()) {
encoded << iter->second;
} else {
encoded << ch;
}
}
return encoded;
}
Code: Select all
hello0.000000wx+forum
Code: Select all
#include <wx/wx.h>
#include <wx/uri.h>
#include <unordered_map>
typedef std::unordered_map<wxString, wxString> wxStringMap_t;
wxString DecodeURI(const wxString& uri)
{
static wxStringMap_t T = { { "%20", " " }, { "%21", "!" }, { "%23", "#" }, { "%24", "$" }, { "%26", "&" },
{ "%27", "'" }, { "%28", "(" }, { "%29", ")" }, { "%2A", "*" }, { "%2B", "+" },
{ "%2C", "," }, { "%3B", ";" }, { "%3D", "=" }, { "%3F", "?" }, { "%40", "@" },
{ "%5B", "[" }, { "%5D", "]" } };
wxString decodedString;
wxString escapeSeq;
int state = 0;
for(size_t i = 0; i < uri.size(); ++i) {
wxChar ch = uri[i];
switch(state) {
case 0: // Normal
switch(ch) {
case '%':
state = 1;
escapeSeq << ch;
break;
default:
decodedString << ch;
break;
}
break;
case 1: // Escaping mode
escapeSeq << ch;
if(escapeSeq.size() == 3) {
// Try to decode it
wxStringMap_t::iterator iter = T.find(escapeSeq);
if(iter != T.end()) {
decodedString << iter->second;
} else {
decodedString << escapeSeq;
}
state = 0;
escapeSeq.Clear();
}
break;
}
}
return decodedString;
}
wxString EncodeURI(const wxString& uri)
{
static std::unordered_map<int, wxString> sEncodeMap = {
{ (int)'!', "%21" }, { (int)'#', "%23" }, { (int)'$', "%24" }, { (int)'&', "%26" }, { (int)'\'', "%27" },
{ (int)'(', "%28" }, { (int)')', "%29" }, { (int)'*', "%2A" }, { (int)'+', "%2B" }, { (int)',', "%2C" },
{ (int)';', "%3B" }, { (int)'=', "%3D" }, { (int)'?', "%3F" }, { (int)'@', "%40" }, { (int)'[', "%5B" },
{ (int)']', "%5D" }, { (int)' ', "%20" }
};
wxString encoded;
for(size_t i = 0; i < uri.length(); ++i) {
wxChar ch = uri[i];
std::unordered_map<int, wxString>::iterator iter = sEncodeMap.find((int)ch);
if(iter != sEncodeMap.end()) {
encoded << iter->second;
} else {
encoded << ch;
}
}
return encoded;
}
class MyFrame : public wxFrame
{
public:
MyFrame() : wxFrame(NULL, wxID_ANY, "Test")
{
wxTextCtrl* logCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxTE_RICH2 | wxTE_READONLY);
wxLog::SetActiveTarget(new wxLogTextCtrl(logCtrl));
wxLog::DisableTimestamp();
const wxString encoded = "hello%2Fwx+forum";
wxLogMessage(wxURI::Unescape(encoded));
wxLogMessage(DecodeURI(encoded));
}
};
class MyApp : public wxApp
{
public:
bool OnInit() override
{
(new MyFrame())->Show();
return true;
}
}; wxIMPLEMENT_APP(MyApp);