[PYTHON] L'espace est-il remplacé par un signe plus ou% 20 dans le traitement du codage en pourcentage?

Aperçu

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

L'espace est-il remplacé par un signe plus ou% 20 dans le traitement du codage en pourcentage?
Vérifiez si la chaîne est un nombre en python
__init__ appelé par wxPython ou Tkinter était un appel __init__ de la classe héritée en Python
Traitement du langage naturel (données originales) avec Word2Vec développé par des chercheurs Google américains
Analyse par raisonnement bayésien (1) ... Quel est le meilleur, A ou B?
Y a-t-il un biais dans les nombres qui apparaissent dans les nombres de Fibonacci?
Créer une nouvelle liste en combinant des éléments en double dans la liste
L'image est Namekuji
Python échouera s'il y a un espace après la barre oblique inverse
Jouez des sons en Python en supposant que le clavier est un clavier de piano
Quoi qu'il en soit, le journal de communication série le plus rapide est laissé dans le fichier
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
Animer ce qui se passe dans l'espace de fréquences lorsque la fréquence de Nyquist est dépassée
[Golang] Vérifiez si une chaîne de caractères spécifique est incluse dans la chaîne de caractères
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.