Kennt jemand einen guten C ++ - Code, der dies tut?
c++
urlencode
urldecode
percent-encoding
user126593
quelle
quelle
Antworten:
Ich war neulich mit der Kodierungshälfte dieses Problems konfrontiert. Unzufrieden mit den verfügbaren Optionen, und nach einem Blick auf diesem C - Beispielcode , habe ich beschlossen , meine eigenen C ++ url-encode Funktion zu rollen:
Die Implementierung der Dekodierungsfunktion bleibt dem Leser als Übung überlassen. : P.
quelle
setw(0)
Ich habe auch die Gelegenheit genutzt, diesen sinnlosen Anruf zu entfernen (zu der Zeit dachte ich, dass die minimale Breite so lange bestehen bleiben würde, bis ich sie wieder geändert habe, aber tatsächlich wird sie nach der nächsten Eingabe zurückgesetzt).isalnum(c)
, es muss geändert werden zuisalnum((unsigned char) c)
Beantwortung meiner eigenen Frage ...
libcurl hat curl_easy_escape zum Codieren.
Zum Dekodieren curl_easy_unescape
quelle
nicht das beste, aber es funktioniert gut ;-)
quelle
'%'
statt verwenden37
.cpp-netlib hat Funktionen
Sie ermöglichen das einfache Kodieren und Dekodieren von URL-Zeichenfolgen.
quelle
Normalerweise funktioniert das Hinzufügen von '%' zum int-Wert eines Zeichens beim Codieren nicht. Der Wert soll dem Hex-Äquivalent entsprechen. zB '/' ist '% 2F' nicht '% 47'.
Ich denke, dies ist die beste und prägnanteste Lösung sowohl für die URL-Codierung als auch für die Decodierung (keine großen Header-Abhängigkeiten).
quelle
if(ic < 16) new_str += "%0";
Wofür ist das Catering? @tormuto @reliasn[Nekromant-Modus ein]
Stolperte über diese Frage, als ich nach einer schnellen, modernen, plattformunabhängigen und eleganten Lösung suchte. Cpp-netlib würde der Gewinner sein, aber es hat eine schreckliche Speicheranfälligkeit in der "dekodierten" Funktion. Also habe ich mir die Spirit Qi / Karma-Lösung von Boost ausgedacht.
Die Verwendung von oben wie folgt:
[Nekromant-Modus aus]
EDIT01: Das Zero-Padding-Zeug wurde behoben - ein besonderer Dank geht an Hartmut Kaiser.
EDIT02: Live on CoLiRu
quelle
cpp-netlib
? Können Sie eine kurze Erklärung oder einen Link geben?CGICC enthält Methoden zum Codieren und Decodieren von URLs . form_urlencode und form_urldecode
quelle
Inspiriert von xperroni habe ich einen Decoder geschrieben. Danke für den Hinweis.
Bearbeiten: Nicht benötigter cctype und iomainip enthält entfernt.
quelle
Hinzufügen eines Follow-Ups zu Bills Empfehlung für die Verwendung von libcurl: großartiger Vorschlag und zu aktualisieren:
Nach 3 Jahren ist die Funktion curl_escape veraltet. Für die zukünftige Verwendung ist es daher besser, curl_easy_escape zu verwenden .
quelle
Ich bin auf diese Frage gestoßen, als ich nach einer API gesucht habe, um die URL in einer Win32 C ++ - App zu dekodieren. Da die Frage die Plattform nicht ganz spezifiziert, ist die Annahme, dass Windows keine schlechte Sache ist.
InternetCanonicalizeUrl ist die API für Windows-Programme. Mehr Infos hier
InternetCrackUrl ( hier ) scheint auch Flags zu haben, um anzugeben, ob die URL dekodiert werden soll
quelle
Ich konnte hier keine URI-Dekodierung / Unescape finden, die auch 2- und 3-Byte-Sequenzen decodiert. Mit meiner eigenen Hochleistungsversion konvertiert diese On-the-Fly-Eingabe den C-Sting-Eingang in einen String:
quelle
#define __x2d2__(s) (__x2d__(s) << 4 | __x2d__(s+1))
und es soll mit -WError bauen.wstring
ist unrealistisch. Zumindestreserve
genug Platz, sonst haben Sie die ganze Zeit massive NeuzuweisungenDie Windows-API verfügt für diese Aufgabe über die von shlwapi.dll exportierten Funktionen UrlEscape / UrlUnescape .
quelle
+
Diese Version ist reines C und kann optional den Ressourcenpfad normalisieren. Die Verwendung mit C ++ ist trivial:
Ausgänge:
Und die eigentliche Funktion:
quelle
die saftigen Stücke
bemerken, dass
wie in
quelle
Sie können die Funktion "g_uri_escape_string ()" verwenden, sofern glib.h. https://developer.gnome.org/glib/stable/glib-URI-Functions.html
kompiliere es mit:
quelle
Eine andere Lösung ist über die Torheitsbibliothek von Facebook verfügbar :
folly::uriEscape
undfolly::uriUnescape
.quelle
Ich weiß, dass die Frage nach einer C ++ - Methode fragt, aber für diejenigen, die sie möglicherweise benötigen, habe ich eine sehr kurze Funktion in einfachem C entwickelt, um eine Zeichenfolge zu codieren. Es wird keine neue Zeichenfolge erstellt, sondern die vorhandene Zeichenfolge geändert. Dies bedeutet, dass die Größe der neuen Zeichenfolge ausreichen muss. Sehr einfach mitzuhalten.
quelle
Sie können einfach die Funktion AtlEscapeUrl () von atlutil.h verwenden. Lesen Sie einfach die Dokumentation zur Verwendung.
quelle
Musste es in einem Projekt ohne Boost machen. Also schrieb ich meine eigenen. Ich werde es einfach auf GitHub stellen: https://github.com/corporateshark/LUrlParser
quelle