String in URL Form Umwandeln



  • Da hab ich nun ein Problem.

    replace(request.begin(), request.end(), ' ', '%20');
    

    geht leider nicht.

    replace(request.begin(), request.end(), ' ', '%');
    

    geht

    Naja wenn jemand einen Tipp hat wäre ich echt dankbar.



  • Hi,

    vielleicht fällt Dir der Unterschied zwischen '%' und '%20' selbst auf.
    Kleiner Tipp: Zähl mal die Buchstaben. 😉

    Gruß,

    Simon2.



  • Ja das hab ich auch schon bemerkt, aber ich hab einige beispiele gesehen wo winNT duch win2000 ersetzt wurde und das ist ja wohl auch unterschiedlich



  • Geht nur darum, dass man mit '' einen Buchstaben maskiert und mit "" mehr als einen.. Tip: %20 sind drei 😃



  • Naja mein Problem ist, dass ich leider keine Einfache möglichkeit gefunden habe einzelne Zeichen in einem String durch die für eine URI nötigen ersetzen kann.

    aus ' ' wird z.b. ein %20

    das ist ja einfach ein Hex Zeichen aber wie füge ich das in den String ein?

    MFG

    Michael



  • %20 ist definitiv kein Hex-Zeichen (was auch immer ein Hex-Zeichen sein soll)! "%20" ist ein string, eine Zeichenkette.



  • Krimpernikus schrieb:

    Naja mein Problem ist, dass ich leider keine Einfache möglichkeit gefunden habe einzelne Zeichen in einem String durch die für eine URI nötigen ersetzen kann.

    OMFG zum 3. Mal: Du übergibst kein Zeichen sondern einen String!!!

    Zeichen werden mit ' ' angegeben, strings mit " "!!! Checkst du das nicht?





  • ich checke es schon aber es geht einfach nicht. Ersetze ich ' ' duchr 'A' geht es ersteze ich " " "A" geht es

    will ich nun aber " " duch "AB" erstezen geht es nicht!



  • // Gibt den neuen String zurück. Die Elemente in der map geben an, welche Strings durch was ersetzt werden sollen.
    string ReplaceTokens( const string& orig, const map<string,string>& tokens )
    {
    	// Dieser String wird am Schluss zurückgegeben
    	string ret;
    
    	// In der Schleife wird der gesamte String durchlaufen
    	for ( string::const_iterator origIter=orig.begin(); origIter!=orig.end(); origIter++ )
    	{
    		// Hier wird geschaut, ob beim/ab dem nächsten Zeichen etwas ersetzt werden muss
    		bool is_token = false;
    		for ( map<string,string>::const_iterator tokenIter=tokens.begin(); tokenIter!=tokens.end(); tokenIter++ )
    		{
    			// Nur vergleichen, wenn der zu ersetzende String überhaupt noch enthalten sein kann
    			if ( origIter + tokenIter->first.size() < orig.end() )
    			{
    				// Vergleichen...
    				if ( string( origIter, origIter+tokenIter->first.size() ) == tokenIter->first )
    				{
    					// Den neuen String anhängen
    					ret += tokenIter->second;
    
    					// Die ersetzte Stelle im Original-String überspringen
    					origIter += tokenIter->first.size() - 1;
    
    					// Und angeben, dass wir etwas ersetzt haben
    					is_token = true;
    					break;
    				}
    			}
    		}
    
    		// Wurde nix ersetzt, dann den momentanen Buchstaben hintendran hängen
    		if ( ! is_token )
    			ret += *origIter;
    	}
    	return ret;
    }
    
    int main(int argc, char *argv[])
    {
    	string orig = "Hello Wörld";
    	map<string,string> tokens;
    	tokens[" "] = "%20";
    	tokens["ö"] = "&ouml";
    	string result = ReplaceTokens( orig, tokens );
    	cout << result << endl;
    	return 0;
    }
    


  • Das macht aber nicht das gewollte. Die URL-Kodierung schreibt vor, dass alle nicht-alphanumerischen Zeichen außer ., _, - und ~ in der Form %xx, mit xx als Hexdarstellung des Bytewertes übersetzt werden. Empfohlen ist außerdem, UTF-8 zur Kodierung zu verwenden. ö wäre also "%C3%B6". Das ist mit isalnum(c) aus <cctype> leicht abzuhandeln (und fängt auch Nicht-ASCII-UTF-8-Zeichen ab).

    std::string to_url_string (std::string const& s)
    {
        std::string result;
        for (std::string::const_iterator i = s.begin (); i != s.end (); ++i)
        {
            if (!std::isalnum (*i) || *i == '_' || *i == '-' || *i == '.' || *i == '~')
                result += escaped_char (*i);
            else
                result += *i;
        }
        return result;
    }
    

    (escaped_char kannst du ruhig selbst machen ;))

    Falls die Eingabe eine komplette URL ist muss des Weiteren beachtet werden, dass Zeichen wie /, # oder & innerhalb von URLs eine Sonderbedeutung haben und damit nur escaped werden dürfen, wenn sie nicht in dieser Sonderbedeutung sondern als „Wert“ auftreten.



  • .filmor schrieb:

    Das macht aber nicht das gewollte. Die URL-Kodierung schreibt vor, dass alle nicht-alphanumerischen Zeichen außer ., _, - und ~ in der Form %xx, mit xx als Hexdarstellung des Bytewertes übersetzt werden.

    Na gut, kenne mich halt mit Web-Krams kaum aus 🤡


Anmelden zum Antworten