So codieren Sie das Pluszeichen (+) in der URL

74

Über den folgenden URL-Link wird ein neues Google Mail-Fenster geöffnet. Das Problem, das ich habe, ist, dass Google alle Pluszeichen (+) im E-Mail-Text durch Leerzeichen ersetzt. Es sieht so aus, als ob es nur mit dem + -Zeichen passiert. Irgendwelche Vorschläge, wie man das beheben kann? (Ich arbeite auf der ASP.NET-Webseite)

https://mail.google.com/mail?view=cm&tf=0&[email protected]&su=some subject & body = Hallo zusammen + Hallo da

(In der Text-E-Mail wird "Hallo dort + Hallo dort" als "Hallo dort Hallo dort" angezeigt.)

user523234
quelle

Antworten:

110

Das +Zeichen hat eine besondere Bedeutung in einer URL => es bedeutet Leerzeichen. Wenn Sie das +Zeichen verwenden möchten, müssen Sie es per URL codieren:

body=Hi+there%2bHello+there

Hier ist ein Beispiel, wie Sie URLs in .NET ordnungsgemäß generieren können:

var uriBuilder = new UriBuilder("https://mail.google.com/mail");

var values = HttpUtility.ParseQueryString(string.Empty);
values["view"] = "cm";
values["tf"] = "0";
values["to"] = "[email protected]";
values["su"] = "some subject";
values["body"] = "Hi there+Hello there";

uriBuilder.Query = values.ToString();

Console.WriteLine(uriBuilder.ToString());

Das Ergebnis

https://mail.google.com:443/mail?view=cm&tf=0&to=someemail%40somedomain.com&su=some+subject&body=Hi+there%2bHello+there

Darin Dimitrov
quelle
3
Der RFC sagt eindeutig, dass das + -Zeichen nicht codiert verwendet werden kann, und auch wenn es codiert werden musste, gibt es keinen Grund, es in ein "Leerzeichen" umzuwandeln. Vielleicht können Sie uns auf ein geeignetes Dokument eines Standards verweisen, in dem erwähnt wird, was es heißt, ein + -Symbol in ein Leerzeichen zu übersetzen und umgekehrt.
Pablo Ariel
3
Ja wovon redest du? Ich habe noch nie einen RFC gesehen oder irgendetwas, das sagt + bedeutet Leerzeichen ....
freedrull
1
Warnung: Wenn Sie die UriEigenschaft von verwenden, erhalten UriBuilderSie ein schlechtes Ergebnis. uriBuilder.Uri.ToString()in Ihrem Beispiel würde zurückkehren Hi+there+Hello+there. Die Verwendung uriBuilder.Uri.AbsoluteUrischeint ordnungsgemäß zu funktionieren, und stackoverflow.com/a/15120429/1931573 legt nahe, dass dies in .NET 4.5 behoben ist. In Bezug auf RFC besagt die HTML 4-Spezifikation, dass der URL-Querystring vom Typ ist, application/x-www-form-urlencodedder selbst (+) als Bedeutungsraum definiert. Es ist also kein RFC, sondern Teil des HTML-Standards.
Nick
@freedrull, aber es funktioniert wirklich so - das zeigt die Anzahl der Upvotes
godblessstrawberry
Beachten Sie, dass IIS diese "doppelte Codierung" berücksichtigt und häufig eine auf diese Weise mit diesem Fehler geladene URL blockiert: HTTP-Fehler 404.11 - Nicht gefunden Das Anforderungsfiltermodul ist so konfiguriert, dass eine Anforderung abgelehnt wird, die eine doppelte Escape-Sequenz enthält.
Brady Moritz
24

Wenn Sie ein Pluszeichen (+) im Körper möchten, müssen Sie es als 2B codieren.

Zum Beispiel: Versuchen Sie dies

Schwarzer Frosch
quelle
3

Es ist sicherer, alle Zeichen mit Ausnahme der in RFC-3986 als "nicht reserviert" definierten Zeichen immer in Prozent zu codieren.

nicht reserviert = ALPHA / DIGIT / "-" / "." / "_" / "~"

Codieren Sie also das Pluszeichen und andere Sonderzeichen in Prozent.

Das Problem, das Sie mit Pluspunkten haben, liegt darin, dass gemäß RFC-1866 (HTML 2.0-Spezifikation) Absatz 8.2.1. Unterabsatz 1., "Die Namen und Werte der Formularfelder werden maskiert: Leerzeichen werden durch" + "ersetzt, und dann werden reservierte Zeichen maskiert"). Diese Art der Codierung von Formulardaten wird auch in späteren HTML-Spezifikationen angegeben. Suchen Sie nach relevanten Absätzen zu application / x-www-form-urlencoded.

Maxim Masiutin
quelle
1

Nur um dies der Liste hinzuzufügen:

Uri.EscapeUriString("Hi there+Hello there") // Hi%20there+Hello%20there
Uri.EscapeDataString("Hi there+Hello there") // Hi%20there%2BHello%20there

Siehe https://stackoverflow.com/a/34189188/98491

Normalerweise möchten Sie verwenden, EscapeDataStringwas es richtig macht.

Jürgen Steinblock
quelle