[PYTHON] Wird der Leerzeichen bei der Verarbeitung der prozentualen Codierung durch ein Pluszeichen oder% 20 ersetzt?

Überblick

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

Wird der Leerzeichen bei der Verarbeitung der prozentualen Codierung durch ein Pluszeichen oder% 20 ersetzt?
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
__init__, das von wxPython oder Tkinter aufgerufen wurde, war ein __init__ -Aufruf der geerbten Klasse in Python
Verarbeitung natürlicher Sprache (Originaldaten) mit Word2Vec, entwickelt von US-amerikanischen Google-Forschern
Analyse nach Bayes'schem Denken (1) ... Was ist besser, A oder B?
Gibt es eine Verzerrung in den Zahlen, die in den Fibonacci-Zahlen erscheinen?
Erstellen Sie eine neue Liste, indem Sie doppelte Elemente in der Liste kombinieren
Das Bild ist Namekuji
Python schlägt fehl, wenn nach dem Backslash ein Leerzeichen steht
Spielen Sie Sounds in Python ab, vorausgesetzt, die Tastatur ist eine Klaviertastatur
Auf jeden Fall bleibt das schnellste serielle Kommunikationsprotokoll in der Datei
Löschen Sie ein bestimmtes Zeichen in Python, wenn es das letzte ist
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Animieren Sie, was im Frequenzraum passiert, wenn die Nyquist-Frequenz überschritten wird
[Golang] Überprüfen Sie, ob eine bestimmte Zeichenfolge in der Zeichenfolge enthalten ist
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.