Hat C # ein Äquivalent zu encodeURIComponent () von JavaScript?

135

In JavaScript:

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

Gibt es ein Äquivalent für C # -Anwendungen? Um HTML-Zeichen zu entkommen, habe ich Folgendes verwendet:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

Ich bin mir jedoch nicht sicher, wie ich die Übereinstimmung in das von JS verwendete korrekte Hexadezimalformat konvertieren soll. Zum Beispiel dieser Code:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

Gibt " %a9%221a"für "©√"statt" zurück "%C2%A9%E2%88%9A". Es sieht so aus, als müsste ich die Zeichenfolge in Bytes oder ähnliches aufteilen.

Edit: Dies ist eine Windows - Anwendung, die nur Elemente in System.Websind: AspNetHostingPermission, AspNetHostingPermissionAttributeund AspNetHostingPermissionLevel.

Travis
quelle

Antworten:

217

Uri.EscapeDataStringoder HttpUtility.UrlEncodeist der richtige Weg, um einer Zeichenfolge zu entkommen, die Teil einer URL sein soll.

Nehmen Sie zum Beispiel die Zeichenfolge "Stack Overflow":

  • HttpUtility.UrlEncode("Stack Overflow") -> "Stack+Overflow"

  • Uri.EscapeUriString("Stack Overflow") -> "Stack%20Overflow"

  • Uri.EscapeDataString("Stack + Overflow")-> Codiert auch "+" to "%2b"---->Stack%20%2B%20%20Overflow

Nur der letzte ist korrekt, wenn er als tatsächlicher Teil der URL verwendet wird (im Gegensatz zum Wert eines der Abfragezeichenfolgenparameter).

Steve
quelle
Das Hauptproblem war, dass ich in meiner Lösung keinen Verweis auf System.Web hatte, aber EscapeUriString war mir nicht bekannt, danke!
Travis
53
Im Gegensatz zu encodeURIComponent () codiert Uri.EscapeUriString () "+" nicht in "% 2b". Verwenden Sie stattdessen Uri.EscapeDataString ().
Jwaliszko
4
Verwenden Sie WebUtility anstelle von HttpUtility, um zu vermeiden, dass Sie auf System.Web verweisen müssen. HttpUtility ist in .NET Core nicht vorhanden.
Steven De Kock
2
@Steve Würden Sie in Betracht ziehen, Ihren letzten Absatz fett zu machen? Es scheint das Wichtigste zu sein, was man auf dieser Seite wissen muss, und es braucht mehr Sichtbarkeit.
Timo
Weitere Erklärungen zum Unterschied zwischen Uri.EscapeUriString und Uri.EscapeDataString finden Sie in dieser Antwort: stackoverflow.com/questions/4396598/…
Jason
20

HttpUtility.HtmlEncode/ Decodieren
HttpUtility.UrlEncode/ Decodieren

Sie können der System.WebAssembly einen Verweis hinzufügen, wenn dieser in Ihrem Projekt nicht verfügbar ist

David Thibault
quelle
Ich hätte genauer sein sollen: Dies ist für eine Windows-App. Die einzigen in System.Web verfügbaren Elemente sind: AspNetHostingPermission, AspNetHostingPermissionAttribute und AspNetHostingPermissionLevel.
Travis
5
Sie können einen Verweis auf die System.Web-Assembly hinzufügen
David Thibault
2
HtmlEncoding ist eine ganz andere Sache. UrlEncode ist eine unsinnige API, die niemals verwendet werden sollte. Es ist nicht sinnvoll, eine gesamte URL zu codieren (es sei denn, Sie möchten ihren Wert tatsächlich codieren, um ihn als Parameter zu verwenden - dies ist jedoch nicht der Fall). Der Punkt des Codierens / Escapings besteht darin, dass Sie vermitteln, dass ein reserviertes Zeichen ohne seine übliche Bedeutung durchlaufen werden soll (z. B. dass? Die Abfrage identifiziert oder & Abfrageparameter trennt). Dies erfordert Kenntnisse, die UrlEncode nicht hat und nicht haben kann.
Brandon Paddock
18

Ich habe versucht, ein vollständig kompatibles Analogon der encodeURIComponent von Javascript für c # zu erstellen, und nach meinen 4-stündigen Experimenten habe ich dies gefunden

c # CODE:

string a = "!@#$%^&*()_+ some text here али мамедов баку";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");

das Ergebnis ist : !% 40% 23% 24% 25% 5e% 26 * () _% 2b% 20some% 20text% 20here% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% be% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

Nachdem Sie es mit der decodeURLComponent () von Javascript dekodiert haben;

Sie erhalten Folgendes : ! @ # $% ^ & * () _ + Text hier али мамедов баку

Vielen Dank für die Aufmerksamkeit

Ali Mamedov
quelle
2
Funktioniert, aber Sie können Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")stattdessen einfach verwenden .
mklement0
Tatsächlich Uri.EscapeDataStringcodiert die Zeichen '(' und ')', während HttpUtility.UrlEncodedies nicht der Fall ist.
Øystein Kolsrud
12

System.Uri.EscapeUriString () schien nichts zu tun, aber System.Uri.Escape Data String () funktionierte für mich.

Echilon
quelle
10

Versuchen Sie es Server.UrlEncode()oder System.Web.HttpUtility.UrlEncode()in Fällen, in denen Sie keinen Zugriff auf das ServerObjekt haben. Sie können auch System.Uri.EscapeUriString()vermeiden, dass der System.WebAssembly ein Verweis hinzugefügt wird .

Billy Jo
quelle
1
Uri.EscapeUriString () hat nichts für mich getan, aber ich konnte die Zeichenfolgen mit Uri.EscapeDataString ()
Toland Hon
3
@ TolHon: In der Tat. Der Grund dafür ist, dass dies Uri.EscapeUriString()JavaScript entspricht, bei encodeURI()dem URI-reservierte Zeichen beibehalten werden. wie /, &... wie sie ist (plus #), während - wie Sie entdeckt haben, ist es , Uri.EscapeDataString()dass entspricht JavaScript ist encodeURIComponent().
mklement0
8

Für eine Windows Store-App steht HttpUtility nicht zur Verfügung. Stattdessen haben Sie:

Für eine URI vor dem '?':

  • System. Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

Für einen URI-Abfragenamen oder -wert nach dem '?':

  • System. Uri.EscapeDataString (" Stapelüberlauf ++")
    • -> "Stack% 20Overflow% 2B% 2B"

Für einen x-www-form-urlencodierten Abfragenamen oder -wert in einem POST-Inhalt:

  • System.Net. WebUtility.UrlEncode (" Stapelüberlauf ++")
    • -> "Stapel + Überlauf% 2B% 2B"
Cœur
quelle
6

Sie können das Server-Objekt im System.Web-Namespace verwenden

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode und Server.HtmlDecode.

Bearbeiten: Poster fügte hinzu, dass dies eine Windows-Anwendung und keine Web-Anwendung war, wie man glauben würde. Die oben aufgeführten Elemente sind in der HttpUtility-Klasse in System.Web verfügbar, die als Referenz zum Projekt hinzugefügt werden muss.

Mitchel Sellers
quelle
1
Auf das Server-Objekt kann nicht über eine Windows-App
zugegriffen werden