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&to=someemail@somedomain.com&su=some subject & body = Hallo zusammen + Hallo da

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

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"] = "someemail@somedomain.com";
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


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



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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.