In einigen Sprachen haben wir untersucht, ob das Leerzeichen bei der Verarbeitung der prozentualen Codierung durch ein Pluszeichen oder "% 20" ersetzt wurde.
Bei der Suche nach der Abfragezeichenfolge einer URL oder dem Hauptteil von "application / x-www-form-urlencoded" erfordern die HTML5- und URL-Standardspezifikationen, dass Leerzeichen in ein Pluszeichen (+) konvertiert werden.
Andererseits behandelt der HTTP-Server sowohl "+" als auch "% 20" als Leerzeichen, da es keine explizite Angabe für die prozentuale Codierung gab. Serverseitige Sprachen bieten keine Codierungsmethode oder -option für "application / x-www-form-urlencoded" und können eine Codierungsmethode gemäß der RFC 3986-Spezifikation ersetzen.
In den meisten Fällen müssen Sie nicht wissen, ob der Speicherplatz durch (+
) oder Prozentcodierung (% 20
) ersetzt wird, aber mit OAuth ist dies ein Problem.
Für OAuth 1.0 ist eine prozentuale Codierung (RFC 3986) für den Speicherplatz erforderlich, was zu einem Fehler für Bibliotheken führt, die die Pluszeichencodierungsmethode verwenden. Twitter hat einen Kommentarartikel über die prozentuale Codierung veröffentlicht.
JavaScript
URLSearchParams
basiert auf URL Standard. Das Leerzeichen wird durch ein Pluszeichen ersetzt.
const params = new URLSearchParams();
params.append("msg", "hello world");
console.log("msg=hello+world" === params.toString());
URLSearchParams
behandelt auch% 20 als Leerzeichen. Die Ergebnisse der Analyse sind wie folgt.
const params2 = new URLSearchParams("msg=hello+world");
console.log("hello world" === params2.get("msg"));
const params3 = new URLSearchParams("msg=hello%20world");
console.log("hello world" === params3.get("msg"));
Ersetzen Sie für encodeURIComponent
das Leerzeichen durch% 20
.
console.log("hello%20world" === encodeURIComponent("hello world"));
Wenn Sie das Leerzeichen durch ein Pluszeichen ersetzen möchten, fügen Sie einen Aufruf zu "Ersetzen" hinzu.
const ret = encodeURIComponent("hello world").replace(/%20/g, '+')
console.log("hello+world" === ret);
decodeURIComponent
ersetzt% 20
durch ein Leerzeichen, jedoch nicht durch das Pluszeichen.
console.log("hello world" === decodeURIComponent("hello%20world"));
console.log("hello+world" === decodeURIComponent("hello+world"));
Node.js
Es ist besser, "URLSearchParams" zu bevorzugen, das von Node.js v7.0 unterstützt wird. Zeigt die vorherige Methode vor Version 7.0 an.
Das Standardmodul "querystring.stringify" ersetzt Leerzeichen durch "% 20".
const querystring = require('querystring');
const ret = querystring.stringify({ msg: "hello world" });
console.log("msg=hello%20world" === ret);
querystring.parse
ersetzt sowohl +
als auch% 20
durch Leerzeichen.
const querystring = require("querystring");
console.log("hello world" === querystring.parse("msg=hello+world")["msg"]);
console.log("hello world" === querystring.parse("msg=hello%20world")["msg"]);
Wenn Sie eine Codierung benötigen, die auf der RFC 3986-Spezifikation basiert, führen Sie ljharb / qs
ein.
const qs = require("qs");
console.log("msg=hello%20world" === qs.stringify({ msg: "hello world" }));
console.log("hello world" === qs.parse("msg=hello+world")["msg"]);
console.log("hello world" === qs.parse("msg=hello%20world")["msg"]);
Python 3
Verwenden Sie "urllib". urlencode
ist standardmäßig ein Leerzeichen +
Ersetzen mit.
>>> from urllib.parse import urlencode
>>> urlencode({"msg": "hello world"})
'msg=hello+world'
Wenn Sie "quote_via = quote" angeben, wird das Leerzeichen durch "% 20" ersetzt.
>>> from urllib.parse import urlencode, quote
>>> urlencode({"msg": "hello world"}, quote_via=quote)
'msg=hello%20world'
Sowohl parse_qs
als auch parse_qsl
ersetzen+
und% 20
durch Leerzeichen.
>>> from urllib.parse import parse_qs
>>> parse_qs("msg=hello+world")
{'msg': ['hello world']}
>>> parse_qs("msg=hello%20world")
{'msg': ['hello world']}
Go
Verwenden Sie das Modul "net / url". Der "Encode" vom Typ "url.Values" ersetzt das Leerzeichen durch "+". ParseQuery
ersetzt +
und% 20
durch Leerzeichen.
package main
import (
"fmt"
"net/url"
)
func main() {
v := url.Values{}
v.Set("msg", "hello world")
fmt.Println(v.Encode())
// msg=hello+world
m, _ := url.ParseQuery("msg=hello+world")
fmt.Println(m["msg"][0])
// hello world
m2, _ := url.ParseQuery("msg=hello%20world")
fmt.Println(m2["msg"][0])
}
"QueryEscape" konvertiert Leerzeichen in "+", während "PathEscape" in "% 20" konvertiert. Außerdem konvertiert "PathUnescape" nicht "+" in Leerzeichen.
func main() {
fmt.Println("QueryEscape")
fmt.Println(url.QueryEscape("hello world"))
// hello+world
fmt.Println(url.QueryUnescape("hello+world"))
// hello world
fmt.Println(url.QueryUnescape("hello%20world"))
// hello world
fmt.Println()
fmt.Println("PathEscape")
fmt.Println(url.PathEscape("hello world"))
// hello%20world
fmt.Println(url.PathUnescape("hello+world"))
// hello+world
fmt.Println(url.PathUnescape("hello%20world"))
// hello world
}
Recommended Posts