web-dev-qa-db-fra.com

Quand encoder de l'espace en plus (+) ou% 20?

Parfois, les espaces sont encodés en URL sous le signe +, d'autres fois en %20. Quelle est la différence et pourquoi cela devrait-il arriver?

435
Muhammad Hewedy

+ désigne un espace uniquement dans application/x-www-form-urlencoded contenu, tel que la partie requête d'une URL:

http://www.example.com/path/foo+bar/path?query+name=query+value

Dans cette URL, le nom du paramètre est query name avec un espace et la valeur query value avec un espace, mais le nom du dossier dans le chemin est littéralement foo+bar, pas foo bar.

%20 est un moyen valide d'encoder un espace dans l'un ou l'autre de ces contextes. Ainsi, si vous avez besoin de coder une chaîne pour l'inclure dans une partie d'une URL, il est toujours prudent de remplacer les espaces par %20 et les points positifs par %2B. C'est ce que par exemple. encodeURIComponent() fait en JavaScript. Malheureusement, ce n'est pas ce que rlencode fait dans PHP ( rawurlencode est plus sûr).

Voir aussi Application HTML 4.01 Specification/x-www-form-urlencoded

441
bobince

http://www.example.com/some/path/to/resource?param1=value1

La partie précédant le point d'interrogation doit utiliser le codage% (donc %20 pour l'espace). Après le point d'interrogation, vous pouvez utiliser %20 ou + pour un espace. Si vous avez besoin d'un + réel après le point d'interrogation, utilisez %2B.

48
cerberos

Donc, les réponses ici sont toutes un peu incomplètes. L'utilisation d'un '% 20' pour coder un espace dans les URL est explicitement définie dans RFC3986 , qui définit comment un URI est construit. Il n'est pas question dans cette spécification d'utiliser un "+" pour coder des espaces - si vous utilisez uniquement cette spécification, un espace doit être codé sous la forme "% 20".

La mention d'utilisation de '+' pour le codage d'espaces provient des différentes incarnations de la spécification HTML - en particulier dans la section décrivant le type de contenu 'application/x-www-form-urlencoded'. Ceci est utilisé pour enregistrer les données de formulaire.

Maintenant, la spécification HTML 2.0 (RFC1866) dit explicitement, à la section 8.2.2, que la partie requête de la chaîne URL d'une requête GET devrait être codée comme suit: "application/x-www-form-urlencoded" . Ceci, en théorie, suggère qu'il est légal d'utiliser un '+' dans l'URL de la chaîne de requête (après le '?').

Mais ... est-ce vraiment N'oubliez pas que HTML est lui-même une spécification de contenu et que les URL contenant des chaînes de requête peuvent être utilisées avec un contenu autre que HTML. En outre, bien que les versions ultérieures de la spécification HTML continuent de définir le + comme légal dans le contenu de 'application/x-www-form-urlencoded', elles omettent complètement la partie indiquant que les chaînes de requête de requête GET sont définies comme telles. En fait, il n’ya absolument aucune mention du codage de la chaîne de requête après la spécification HTML 2.0.

Ce qui nous laisse avec la question - est-ce valide? Certes, il y a BEAUCOUP de code hérité qui prend en charge le "+" dans les chaînes de requête et beaucoup de code qui le génère également. Donc, les chances sont bonnes que vous ne casseriez pas si vous utilisiez le '+'. (Et, en fait, j’ai fait toutes les recherches à ce sujet récemment parce que j’ai découvert un site majeur qui n’a pas accepté l’espace "% 20" dans une requête GET. Ils n’ont en fait pas décodé TOUT caractère codé. Le service que vous utilisez peut être pertinent aussi.)

Mais à partir d'une lecture pure des spécifications, sans le langage de la spécification HTML 2.0 repris dans les versions ultérieures, les URL sont entièrement couvertes par RFC3986, ce qui signifie que les espaces doivent être convertis en "% 20". Et cela devrait certainement être le cas si vous demandez autre chose qu'un document HTML.

29
zgwortz

Il est préférable de toujours coder les espaces sous la forme% 20 et non sous la forme "+".

C'était la norme RFC-1866 (spécification HTML 2.0), qui spécifiait que les espaces devaient être codés comme "+" dans les paires clé-valeur de type de contenu "application/x-www-form-urlencoded". (voir paragraphe 8.2.1. alinéa 1.). Cette méthode de codage des données de formulaire est également donnée dans les spécifications HTML ultérieures. Recherchez les paragraphes pertinents sur application/x-www-form-urlencoded.

Voici un exemple d'une telle chaîne dans l'URL où RFC-1866 autorise le codage d'espaces en tant que points positifs: "http://example.com/over/there?name=foo+bar". Ainsi, seulement après "?", Les espaces peuvent être remplacés par des plus, selon RFC-1866. Dans les autres cas, les espaces doivent être codés en% 20. Mais comme il est difficile de déterminer le contexte, il est recommandé de ne jamais encoder d'espaces sous la forme "+".

Je recommanderais d'encoder tous les caractères, sauf "sans réserve" défini dans RFC-3986, p.2.3

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
7
Maxim Masiutin

Quelle est la différence: Voir d'autres réponses.

Lorsque vous utilisez + au lieu de %20? Utilisez + si, pour une raison quelconque, vous souhaitez rendre la chaîne de requête d'URL (?.....) ou le fragment de hachage (#....) plus lisible. Exemple: vous pouvez réellement lire ceci:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces (%2B = +)

Mais ce qui suit est beaucoup plus difficile à lire: (du moins pour moi)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%%%%%%spaces

Je pense que + a peu de chances de casser quelque chose, car Google utilise + (voir le premier lien ci-dessus) et ils ont probablement déjà réfléchi à cette question. Je vais utiliser + moi-même simplement parce que lisible + Google pense que c'est OK.

2
KajMagnus