<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[URLdecode-Funktion - gut geschrieben?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nach dem ich euch in der letzten Zeit immer mit Fragen zu Problemen gelöchert habe, möchte ich nun mal etwas geben und euch &quot;nur&quot; um eure Meinung fragen.</p>
<p>Seit einigen Tagen versuche ich mit Hilfe des Internets eine URLdecode-Funktion - die mit C++-Strings arbeiten kann - zu finden. Leider habe ich nichts passendes gefunden, daher habe ich mich mal selbst daran gewagt. Anbei ein kleines Beispiel Programm. Ich würde gerne wissen was ihr davon haltet.</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
using namespace std;

#define ISXDIGIT(a) (((a) &gt;= '0' &amp;&amp; (a) &lt;= '9') || ((a) &gt;= 'a' &amp;&amp; (a) &lt;= 'f'))

void URLdecode(string &amp;myString) {

    int pos = 0;
    while(pos &lt; myString.length()) {
        if (myString[pos] == '%') {
            char c1 = tolower(myString[pos+1]);
            char c2 = tolower(myString[pos+2]);
            if (ISXDIGIT(c1) &amp;&amp; ISXDIGIT(c2)) {
                if (c1 &gt;= 'a' &amp;&amp; c1 &lt;= 'f')
                    c1 = c1 - 87;
                if (c2 &gt;= 'a' &amp;&amp; c2 &lt;= 'f')
                    c2 = c2 - 87;
                myString[pos] = char(c1 * 16 + c2);
                myString.erase(pos+1, 2);
            }
        }
        pos++;
    }
}

int main(int argc, char* argv[]) {

    string myString = &quot;http%3A%2F%2Fwww%2Egoogle%2Ede%2F&quot;;
    //string myString = &quot;http%3H%2G%2Fwww%2Zgoogle%2Ede%2F&quot;;

    cout &lt;&lt; &quot;Original: '&quot; &lt;&lt; myString &lt;&lt; &quot;'&quot; &lt;&lt; endl;
    URLdecode(myString);
    cout &lt;&lt; &quot;After URLdecode: '&quot; &lt;&lt; myString &lt;&lt; &quot;'&quot; &lt;&lt; endl;
}
</code></pre>
<p>Vielleicht hat jemand ja eine Idee wie man die Funktion verbessern könnte?</p>
<p>lg,<br />
Funny</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149790/urldecode-funktion-gut-geschrieben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 09:42:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149790.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Jun 2006 12:05:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 12:05:21 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nach dem ich euch in der letzten Zeit immer mit Fragen zu Problemen gelöchert habe, möchte ich nun mal etwas geben und euch &quot;nur&quot; um eure Meinung fragen.</p>
<p>Seit einigen Tagen versuche ich mit Hilfe des Internets eine URLdecode-Funktion - die mit C++-Strings arbeiten kann - zu finden. Leider habe ich nichts passendes gefunden, daher habe ich mich mal selbst daran gewagt. Anbei ein kleines Beispiel Programm. Ich würde gerne wissen was ihr davon haltet.</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
using namespace std;

#define ISXDIGIT(a) (((a) &gt;= '0' &amp;&amp; (a) &lt;= '9') || ((a) &gt;= 'a' &amp;&amp; (a) &lt;= 'f'))

void URLdecode(string &amp;myString) {

    int pos = 0;
    while(pos &lt; myString.length()) {
        if (myString[pos] == '%') {
            char c1 = tolower(myString[pos+1]);
            char c2 = tolower(myString[pos+2]);
            if (ISXDIGIT(c1) &amp;&amp; ISXDIGIT(c2)) {
                if (c1 &gt;= 'a' &amp;&amp; c1 &lt;= 'f')
                    c1 = c1 - 87;
                if (c2 &gt;= 'a' &amp;&amp; c2 &lt;= 'f')
                    c2 = c2 - 87;
                myString[pos] = char(c1 * 16 + c2);
                myString.erase(pos+1, 2);
            }
        }
        pos++;
    }
}

int main(int argc, char* argv[]) {

    string myString = &quot;http%3A%2F%2Fwww%2Egoogle%2Ede%2F&quot;;
    //string myString = &quot;http%3H%2G%2Fwww%2Zgoogle%2Ede%2F&quot;;

    cout &lt;&lt; &quot;Original: '&quot; &lt;&lt; myString &lt;&lt; &quot;'&quot; &lt;&lt; endl;
    URLdecode(myString);
    cout &lt;&lt; &quot;After URLdecode: '&quot; &lt;&lt; myString &lt;&lt; &quot;'&quot; &lt;&lt; endl;
}
</code></pre>
<p>Vielleicht hat jemand ja eine Idee wie man die Funktion verbessern könnte?</p>
<p>lg,<br />
Funny</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074559</guid><dc:creator><![CDATA[FunnyDingo]]></dc:creator><pubDate>Fri, 09 Jun 2006 12:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 12:08:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>um, was macht die URLdecode Funktion denn eigentlich?</p>
<p>Was mir spontan auffällt: Wieso hast du ein Makro definiert, um auf den 'Typ' des chars zu prüfen? Es gibt doch die Funktionen der <a href="http://www.cppreference.com/stdstring/index.html" rel="nofollow">cstring</a>, also isdigit usw.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074563</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 09 Jun 2006 12:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 12:12:04 GMT]]></title><description><![CDATA[<p>Einmal würde ich die &quot;if(c1&lt;..&quot; und &quot;if(c2&lt;..&quot; zu einer Funktion zusammenfassen, zweitens bekommst du im Bereich 0..9 Probleme, weil du dort deine char-Werte nicht umrechnest. Und drittens schau dir mal string::replace() an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074565</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Jun 2006 12:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 12:31:08 GMT]]></title><description><![CDATA[<p>Ich glaube dein Code funktioniert nicht mehr wenn nach dem Prozentzeichen keine 2 Zeichen mehr kommen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074590</guid><dc:creator><![CDATA[.........]]></dc:creator><pubDate>Fri, 09 Jun 2006 12:31:08 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 12:37:51 GMT]]></title><description><![CDATA[<p>Außerdem würde ich einen neuen String erstellen und zurückgeben lassen anstatt das Original zu modifizieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074597</guid><dc:creator><![CDATA[.........]]></dc:creator><pubDate>Fri, 09 Jun 2006 12:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 13:02:25 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>was macht die URLdecode Funktion denn eigentlich?</p>
</blockquote>
<p>Die Funktion wandelt einen String der URL-Encoded ist (z.B. Daten aus einem HTTP GET oder POST Request) in einen &quot;normalen&quot; String um.</p>
<p>GPC schrieb:</p>
<blockquote>
<p>Wieso hast du ein Makro definiert, um auf den 'Typ' des chars zu prüfen? Es gibt doch die Funktionen der cstring, also isdigit usw.</p>
</blockquote>
<p>Okay, ob es ein Digit ist, kann ich damit prüfen - wusste ich nicht. Aber ich muss auch wissen ob es zwischen a und f liegt, denn hex geht ja nur bis f, also darf ein %2g nicht dekodiert werden.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Einmal würde ich die &quot;if(c1&lt;..&quot; und &quot;if(c2&lt;..&quot; zu einer Funktion zusammenfassen</p>
</blockquote>
<p>Wie meinst du das? Eine extra Funktion?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>zweitens bekommst du im Bereich 0..9 Probleme, weil du dort deine char-Werte nicht umrechnest</p>
</blockquote>
<p>Was muss ich denn da umrechnen? 0-9 bleibt 0-9</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Und drittens schau dir mal string::replace() an.</p>
</blockquote>
<p>Wie kann mir string::replace denn dort helfen? Ich müsste ja</p>
<pre><code class="language-cpp">myString.replace(pos, 3, char(c1 * 16 + c2));
</code></pre>
<p>aufrufen, aber damit kompiliert er bei mir nicht. Wenn ich bisher alles richtig verstanden habe ist das auch klar, denn er will an dieser Stelle ja einen const string&amp;. Ich müsste das ja dann wie folgt machen</p>
<pre><code class="language-cpp">string repl;
repl = char(c1*16+c2);
myString.replace(pos, 3, repl);
</code></pre>
<p>Ich nehme mal an so meinst du das?</p>
<p>......... schrieb:</p>
<blockquote>
<p>Ich glaube dein Code funktioniert nicht mehr wenn nach dem Prozentzeichen keine 2 Zeichen mehr kommen...</p>
</blockquote>
<p>Oh, das ist korrekt, ist mir gar nicht aufgefallen. Dürfte sich ja schnell beheben lassen. Denke ein</p>
<pre><code class="language-cpp">while(pos &lt; (myString.length() - 2))
</code></pre>
<p>sollte da reichen, oder?</p>
<p>......... schrieb:</p>
<blockquote>
<p>Außerdem würde ich einen neuen String erstellen und zurückgeben lassen anstatt das Original zu modifizieren.</p>
</blockquote>
<p>Die Aufruf des URLdecode erfolgt in meinem Projekt nur an einer Stelle und zwar wenn der Server die Daten vom Brwoser ließt und das soll möglichst schnell gehen. Nach meinem verständniss ist es versehentlich schneller das ganze per Referenz zu machen als</p>
<pre><code class="language-cpp">myString = URLdecode(myString);
</code></pre>
<p>denn das würde ich dann tun.</p>
<p>lg,<br />
Funny</p>
<p>Edit: Hab grad gesehen das es in der ctype.h auch ein isxdigit() gibt, sorry - hatt das überlesen, werd ich gleich mal ändern!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074612</guid><dc:creator><![CDATA[FunnyDingo]]></dc:creator><pubDate>Fri, 09 Jun 2006 13:02:25 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 13:07:23 GMT]]></title><description><![CDATA[<p>So hatte ich das früher mal geschrieben: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-122247-and-highlight-is-%2Aurldecode%2A.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-122247-and-highlight-is-*urldecode*.html</a></p>
<p>Aber damit war ich auch nicht ganz zufrieden und hab noch was geändert. Hab es jetzt aber verloren.</p>
<p>Das - 87 in deinem Code sieht wie ein Hack aus. Ich verstehs auf jeden Fall nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074622</guid><dc:creator><![CDATA[code.]]></dc:creator><pubDate>Fri, 09 Jun 2006 13:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 13:30:46 GMT]]></title><description><![CDATA[<p>Ich habe mal was ähnliches gemacht. Zu finden in meinen cxxtools (<a href="http://www.tntnet.org/cxxtools.hms" rel="nofollow">http://www.tntnet.org/cxxtools.hms</a>). Da parse ich Query-Parameter. Und das geht so:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;cxxtools/query_params.h&gt;
#include &lt;iostream&gt;

int main(int argc, char* argv[])
{ 
  std::string myString = &quot;p1=Hall%f6chen+Welt&amp;p2=blah&quot;;

  cxxtools::QueryParams q;
  q.parse_url(myString);

  std::cout &lt;&lt; &quot;p1=&quot; &lt;&lt; q[&quot;p1&quot;] &lt;&lt; '\n'
            &lt;&lt; &quot;p2=&quot; &lt;&lt; q[&quot;p2&quot;] &lt;&lt; std::endl;
}
</code></pre>
<p>Der Code zum parsen findest Du in den cxxtools unter src/query_params.cpp in der template-Funktion _parse_url ganz am Anfang. Der Quelltext ist auch Online über <a href="http://www.tntnet.org/download/cxxtools-1.4.1/src/query_params.cpp" rel="nofollow">http://www.tntnet.org/download/cxxtools-1.4.1/src/query_params.cpp</a> aufrufbar.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074631</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 09 Jun 2006 13:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to URLdecode-Funktion - gut geschrieben? on Fri, 09 Jun 2006 13:49:08 GMT]]></title><description><![CDATA[<p>Hab mir deine Idee mal angesehen, da liegt auch der kleine Unterschied zu meiner Funktion und somit beantworte ich deinen Kommentar</p>
<p>code. schrieb:</p>
<blockquote>
<p>Das - 87 in deinem Code sieht wie ein Hack aus. Ich verstehs auf jeden Fall nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>auch direkt:</p>
<p>Nach dem ich ein paar Sachen korrigiert habe, sieht meine Funktion nun so aus:</p>
<pre><code class="language-cpp">void URLdecode(string &amp;myString) {

    int pos = 0;
    while(pos &lt; (myString.length() - 2)) {
        if (myString[pos] == '%') {
            char c1 = tolower(myString[pos+1]);
            char c2 = tolower(myString[pos+2]);
            if (isxdigit(c1) &amp;&amp; isxdigit(c2)) {
                if (c1 &gt;= 'a' &amp;&amp; c1 &lt;= 'f')
                    c1 = c1 - 87;
                else
                    c1 = c1 - 48;
                if (c2 &gt;= 'a' &amp;&amp; c2 &lt;= 'f')
                    c2 = c2 - 87;
                else
                    c2 = c2 - 48;
                //myString[pos] = char(c1 * 16 + c2);
                //myString.erase(pos+1, 2);
                string repl;
                repl = char(c1*16+c2);
                myString.replace(pos, 3, repl);
            }
        }
        pos++;
    }
}
</code></pre>
<p>Und wenn ich keinen Denkfehler habe, dann ist</p>
<p>c1 = c1 - 87; identisch zu hexDigit - 'a' + 10;<br />
c1 = c1 - 48; identisch zu hexDigit - '0';</p>
<p>Beispiel 1<br />
c1 = 'a' - 87 = 10 bzw. 'a' - 'a' + 10 = 10<br />
c1 = 97 - 87 = 10 bzw. 97 - 97 + 10 = 10</p>
<p>Beispiel 2<br />
c1 = '0' - 48 = 0 bzw '0' - '0' = 0<br />
c1 = 48 - 48 = 0 bzw. 48 - 48 = 0</p>
<p>Der Berechnungsweg ist ein wenig anders, aber es kommt das selbe raus. Mag vielleicht daher kommen das ich mich zusehr auf die ASCII-Tabelle (in der 'a' = 97 und '0' = 48 ist) konzentriert habe. Ich werde deine Idee aber gerne aufnehmen - sieht wesentlich besser aus *g*</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9578">@tntnet</a>:<br />
Das hört sich gut an, ich werde mir das mal ansehen. Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074634</guid><dc:creator><![CDATA[FunnyDingo]]></dc:creator><pubDate>Fri, 09 Jun 2006 13:49:08 GMT</pubDate></item></channel></rss>