Wie ersetze ich alle Leerzeichen durch% 20 in C #?

74

Ich möchte mit C # eine Zeichenfolge in eine URL umwandeln. Es muss etwas im .NET Framework geben, das helfen sollte, oder?

Haim Bender
quelle
Dieser Fragentitel stimmt nicht mit der Frage überein. Um alle Leerzeichen durch% 20 (den Titel) in C # zu ersetzen, können Sie verwenden String.Replace(" ", "%20"). Wenn Sie eine URL erstellen, müssen Sie lediglich einen URL-Wert in eine Zeichenfolge einfügen: string url = "https://site/app/?q=cats"Wenn OP jedoch davon sprach, eine URL als GET-Parameter als Teil einer anderen URL zu übergeben, handelt es sich um etwas völlig anderes, das sich beispielsweise von etwas anderem unterscheidet , Ausgeben einer URL in ein HTML-Ankertag in ASP.NET (oder was auch immer).
nichts ist

Antworten:

56

Ich glaube, Sie suchen nach HttpServerUtility.UrlEncode .

System.Web.HttpUtility.UrlEncode(string url)
LiraNuna
quelle
7
Ich denke, Uri.EscapeUriString () ist die geeignete Methode, wenn wir religiös sein müssen :)
Stoyan Dimov
20
@StoyanDimov: EscapeUriString()entkommt &weder noch =noch ?, EscapeDataString()scheint also derjenige zu sein, der verwendet werden soll.
Doug S
4
Jemand hatte diese Frage bearbeitet, um die Antwort vollständig zu ändern. Wir sollten die Bearbeitung nicht verwenden, um die Bedeutung eines bestimmten Beitrags zu ändern .
Palswim
23
@palswim Ja, aber die "akzeptierte" Antwort kann nicht die sein, zu der Sie zurückgekehrt sind: System.Web.HttpUtility.UrlEncodecodiert den Speicherplatz als +und nicht %20, daher ist diese Antwort völlig falsch.
Eregrith
13
Falsche Antwort - Nicht verwenden, UrlEncodeda Leerzeichen durch Leerzeichen ersetzt werden +(anstelle %20dessen das OP ausdrücklich darum gebeten hat), was kein Standard-URI-Schema ist. decodeURIund decodeURIComponentin JavaScript wird dies nicht richtig dekodiert. Verwendung, Uri.EscapeDataStringdie von JavaScript für eine gute Round-Trip-Verwendung von codierten Daten und URIs ordnungsgemäß dekodiert werden kann
nichts
116

Eine andere Möglichkeit ist die Verwendung Uri.EscapeUriString(stringToEscape).

Dirk Vollmar
quelle
5
Leider entgeht diese Methode keinen &Zeichen.
Christian Davén
22
Es entkommt =auch nicht ?. Es scheint Uri.EscapeDataString()der richtige Weg zu sein.
Doug S
Es entkommt auch #nicht
Mykhailo Seniutovych
48

Ich fand es nützlich System.Web.HttpUtility.UrlPathEncode(string str);

Es ersetzt Leerzeichen durch% 20 und nicht durch +.

Gilda
quelle
Es gibt zumindest in 4.0. System.Web.HttpUtility.UrlDecode ("a% 20b") ergibt "a b"
Abacus
4
Es funktioniert, aber verwenden Sie es nicht, da es für Browser ist. Verwenden Sie stattdessen Uri.EscapeUriString (STRING). MSDN: "Nicht verwenden; nur zur Browserkompatibilität vorgesehen. Verwenden Sie UrlEncode." msdn.microsoft.com/en-us/library/…
VRC
Ich fand es hilfreich, weil ich nur einen Teil der URL codieren wollte, sie aber dennoch anklickbar haben wollte. Diese haben mehr als gewünscht getan: System.Uri.EscapeDataString (url) und HttpContext.Current.Server.UrlEncode (url)
sobelito
2
Ich musste Leerzeichen in% 20 und nicht in + codieren, um erfolgreich auf Twitter zu posten. UrlEncode (url) verwandelt Leerzeichen in + und war daher nicht die richtige Antwort für mein Problem.
Jgerman
16

Wie in der genehmigten Story kommentiert, ersetzt die HttpServerUtility.UrlEncode- Methode Leerzeichen durch + anstelle von% 20. Verwenden Sie stattdessen eine dieser beiden Methoden: Uri.EscapeUriString () oder Uri.EscapeDataString ()

Beispielcode:

HttpUtility.UrlEncode("https://mywebsite.com/api/get me this file.jpg")
//"https%3a%2f%2fmywebsite.com%2fapi%2fget+me+this+file.jpg"

Uri.EscapeUriString("https://mywebsite.com/api/get me this file.jpg");
//"https://mywebsite.com/api/get%20me%20this%20file.jpg"
Uri.EscapeDataString("https://mywebsite.com/api/get me this file.jpg");
//"https%3A%2F%2Fmywebsite.com%2Fapi%2Fget%20me%20this%20file.jpg"

//When your url has a query string:
Uri.EscapeUriString("https://mywebsite.com/api/get?id=123&name=get me this file.jpg");
//"https://mywebsite.com/api/get?id=123&name=get%20me%20this%20file.jpg"
Uri.EscapeDataString("https://mywebsite.com/api/get?id=123&name=get me this file.jpg");

//"https%3A%2F%2Fmywebsite.com%2Fapi%2Fget%3Fid%3D123%26name%3Dget%20me%20this%20file.jpg"
Darrel K.
quelle
1

Ich musste das auch tun, fand diese Frage vor Jahren, aber der Titel und der Text der Frage stimmen nicht ganz überein, und die Verwendung von Uri.EscapeDataStringoder UrlEncode(bitte nicht verwenden!) Ist normalerweise nicht sinnvoll, es sei denn, wir sprechen über das Bestehen URLs als Parameter zu anderen URLs.

(Übergeben Sie beispielsweise eine Rückruf-URL, wenn Sie eine offene ID-Authentifizierung, Azure AD usw. durchführen.)

In der Hoffnung, dass dies eine pragmatischere Antwort auf die Frage ist: Ich möchte mit C # eine Zeichenfolge in eine URL umwandeln. Es muss etwas im .NET Framework geben, das helfen sollte, oder?

Ja - zwei Funktionen sind hilfreich, um URL-Zeichenfolgen in C # zu erstellen

  • String.Format zum Formatieren der URL
  • Uri.EscapeDataString zum Escapezeichen von Parametern in der URL

Dieser Code

String.Format("https://site/app/?q={0}&redirectUrl={1}", 
  Uri.EscapeDataString("search for cats"), 
  Uri.EscapeDataString("https://mysite/myapp/?state=from idp"))

erzeugt dieses Ergebnis

https://site/app/?q=search%20for%20cats&redirectUrl=https%3A%2F%2Fmysite%2Fmyapp

Diese können sicher kopiert und in die Adressleiste eines Browsers oder in das srcAttribut eines HTML- ATags eingefügt oder mit curleinem QR-Code usw. verwendet oder in diesen codiert werden.

nichts ist notwendig
quelle
Und ein JavaScript-Äquivalent wäre so etwas wie das, "https://site/app/?q=" + encodeURIComponent("search for cats") + "&redirectUrl=" + encodeURIComponent("https://mysite/myapp/?state=from idp")was die gleiche Ausgabe erzeugt.
nichts ist
0

Der folgende Code ersetzt das sich wiederholende Leerzeichen durch ein einzelnes% 20-Zeichen.

Beispiel:

Eingabe ist:

Code by Hitesh             Jain

Ausgabe:

Code%20by%20Hitesh%20Jain

Code

static void Main(string[] args)
{
    Console.WriteLine("Enter a string");
    string str = Console.ReadLine();
    string replacedStr = null;

    // This loop will repalce all repeat black space in single space
    for (int i = 0; i < str.Length - 1; i++)
    {
        if (!(Convert.ToString(str[i]) == " " &&
            Convert.ToString(str[i + 1]) == " "))
        {
            replacedStr = replacedStr + str[i];
        }
    }
    replacedStr = replacedStr + str[str.Length-1]; // Append last character
    replacedStr = replacedStr.Replace(" ", "%20");
    Console.WriteLine(replacedStr);
    Console.ReadLine();
}
Hitesh Jain
quelle
-3

HttpServerUtility.HtmlEncode

Aus der Dokumentation:

String TestString = "This is a <Test String>.";
String EncodedString = Server.HtmlEncode(TestString);

Dies codiert jedoch tatsächlich HTML und keine URLs. Verwenden Sie stattdessen UrlEncode (TestString) .

George Mauer
quelle
3
Das OP fragt nach der URL-Codierung. keine HTML-Codierung.
Metro Schlumpf
Nein, dies ist für die HTML-Codierung, nicht für die URL-Codierung (wie der Name schon sagt ...)
Thomas Levesque
Ja, Sie haben Recht, verwenden Sie UrlEncode () zum Codieren von URLs - dies ist nur zum Codieren von HTML-Entitäten
George Mauer