Dans certaines langues, nous avons cherché à savoir si l'espace était remplacé par un signe plus ou «% 20» dans le traitement du codage en pourcentage.
Lors de la recherche de la chaîne de requête d'une URL ou du corps de ʻapplication / x-www-form-urlencoded`, les spécifications HTML5 et URL Standard exigent que les espaces soient convertis en signe plus (+).
D'autre part, le serveur HTTP traite à la fois «+» et «% 20» comme des espaces car il n'y avait pas de spécification claire pour le codage en pourcentage. Les langages côté serveur ne fournissent pas de méthodes ou d'options de codage pour ʻapplication / x-www-form-urlencoded` et peuvent remplacer les méthodes de codage selon la spécification RFC 3986.
Dans la plupart des cas, vous n'avez pas besoin de savoir si l'espace est remplacé par (+
) ou le pourcentage d'encodage (% 20
), mais avec OAuth, c'est un problème.
Pour OAuth 1.0, un codage en pourcentage (RFC 3986) est requis pour l'espace, ce qui entraîne une erreur pour les bibliothèques qui utilisent la méthode de codage du signe plus. Twitter a publié un article de commentaire sur le pourcentage d'encodage.
JavaScript
ʻURLSearchParams` est basé sur la norme URL. L'espace est remplacé par un signe plus.
const params = new URLSearchParams();
params.append("msg", "hello world");
console.log("msg=hello+world" === params.toString());
ʻURLSearchParams traite également
% 20` comme un espace. Les résultats de l'analyse sont les suivants.
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"));
Pour ʻencodeURIComponent, remplacez l'espace par
% 20`.
console.log("hello%20world" === encodeURIComponent("hello world"));
Si vous souhaitez remplacer l'espace par un signe plus, ajoutez un appel à replace
.
const ret = encodeURIComponent("hello world").replace(/%20/g, '+')
console.log("hello+world" === ret);
decodeURIComponent
remplace% 20
par un espace, mais pas le signe plus.
console.log("hello world" === decodeURIComponent("hello%20world"));
console.log("hello+world" === decodeURIComponent("hello+world"));
Node.js
Il est préférable de préférer ʻURLSearchParams`, qui est pris en charge à partir de Node.js v7.0. Affiche la méthode précédente avant la v7.0.
Le module standard querystring.stringify
remplace les espaces par% 20
.
const querystring = require('querystring');
const ret = querystring.stringify({ msg: "hello world" });
console.log("msg=hello%20world" === ret);
querystring.parse
remplace à la fois + ʻet
% 20` par des espaces.
const querystring = require("querystring");
console.log("hello world" === querystring.parse("msg=hello+world")["msg"]);
console.log("hello world" === querystring.parse("msg=hello%20world")["msg"]);
Si vous avez besoin d'un encodage basé sur la spécification RFC 3986, introduisez ljharb / qs
.
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
Utilisez ʻurllib. ʻUrlencode
utilise par défaut les espaces +
Remplacer par.
>>> from urllib.parse import urlencode
>>> urlencode({"msg": "hello world"})
'msg=hello+world'
Si vous spécifiez quote_via = quote
, l'espace sera remplacé par% 20
.
>>> from urllib.parse import urlencode, quote
>>> urlencode({"msg": "hello world"}, quote_via=quote)
'msg=hello%20world'
«Parse_qs» et «parse_qsl» remplacent «+» et «% 20» par des espaces.
>>> from urllib.parse import parse_qs
>>> parse_qs("msg=hello+world")
{'msg': ['hello world']}
>>> parse_qs("msg=hello%20world")
{'msg': ['hello world']}
Go
Utilisez le module net / url
. ʻEncode de type ʻurl.Values
remplace l'espace par+
. ParseQuery
remplace + ʻet
% 20` par des espaces.
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
convertit les espaces en +
, tandis que PathEscape
convertit en % 20
. De plus, PathUnescape
ne convertit pas +
en espaces.
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