Quel est l'encodage correct de requête HTTP get cordes?
Ne la HTTP standard ou quelque chose de définir l'encodage doit être utilisé sur des caractères spéciaux avant ils sont encodés dans l'url avec %XXs? Si elle ne définit pas est-il un moyen de définir quel encodage est utilisé? Il semble que la plupart des navigateurs envoyer les données en utf-8.
Vous devez vous connecter pour publier un commentaire.
HTTP standard, pas de. Mais une autre norme, IRI, peuvent entrer en jeu.
Uri sont explicitement (une fois %-décodé) les séquences d'octets. Quels caractères Unicode ces octets sur la carte n'est pas spécifié par l'URI standard ou la HTTP standard pour http:-scheme Uri.
Spécifiquement pour les paramètres de la requête: navigateurs web utilisation de l'encodage de la page d'origine pour faire un formulaire de soumission d'OBTENIR l'URL, donc si vous avez une page en ISO-8859-1, et que vous mettez ‘é’ dans une zone de recherche, vous obtiendrez ‘?search=%E9’, mais si vous faites la même chose dans une page en UTF-8, vous aurez ‘?search=%C3%E9’. Si vous ne servez pas votre page de formulaire avec n'importe quel jeu de caractères particulier le navigateur va deviner, que vous ne voulez pas qu'il sera impossible de deviner ce que le format de la présentation va venir aussi.
Pour les autres parties de l'URL, le navigateur de ne pas les produire lui-même, mais si vous nous les fournissez avec des caractères non-ASCII dans les liens, généralement de les encoder en UTF-8. Ce n'est pas fiable, car il dépend du navigateur et les paramètres régionaux, il est donc préférable de ne pas utiliser le moment.
La norme qui permet des caractères non-ASCII dans les liens est IRI. IRI convertit à l'URI en UTF-8%-encodage de la plupart de l'URL, mais le nom d'hôte est converti à l'aide Punycode à la place. Pour la compatibilité, il est préférable de ne pas compter sur les navigateurs de la compréhension de l'IRIs dans les liens encore. Au lieu de cela, UTF-8-puis-%-encoder votre chemin d'accès et les paramètres de caractères de vous-même. Ils apparaissent toujours comme le droit de caractères dans la barre d'adresse dans les navigateurs modernes; malheureusement, IE n'affiche pas la décodé-caractère IRI forme dans tous les cas, en fonction des paramètres de langue.
Le Wiki de l'IRI pour le grec gamma personnage est:
Codées dans un URI, c'est:
accept-charset
et communiquées au serveur en plusieurs parties formulaire de données de sous-titres, mais dans la pratique, IE obtientaccept-charset
dangereusement faux et aucun navigateur n'envoie des données de formulaire sous-en-têtes, de sorte que nous sommes coincés avec cette situation de s'appuyer sur le formulaire d'encodage. Eh bien, un jour, tout le monde juste utiliser l'UTF-8 et tout marchera bien. Un siècle...Par La RFC 2616,
et
et les Uri sont
token
s avec des séparateurs. Donc, en théorie, rien d'autre que US-ASCII devrait être là. (Dans la pratique, depuis l'ISO-8859-1 extension de US-ASCII est utilisé dans de nombreux autres endroits dans le HTTP specs, il n'est pas rare de trouver des HTTP implémentations qui soutiennent ISO-8859-1 plutôt que de simplement en US-ASCII, mais strictement parlant, ce n'est pas conforme aux normes, HTTP).Autant que je sache, il n'y a aucun moyen de le définir, mais j'ai toujours supposé que c'est l'ASCII, car c'est ce DNS est (pour l'instant, bien que localisée DNS est à venir, avec tous les problèmes que cela comporte).
Remarque: UTF8 est "compatible ASCII", sauf si vous essayez d'utiliser des caractères étendus. C'est probablement ce qui joue un petit rôle dans le raisonnement derrière pourquoi certains navigateurs peuvent envoyer leur OBTENIR les données encodés en utf-8.
EDIT: De votre commentaire, il semble que vous ne savez pas comment l' % encodage fonctionne à tous, donc voilà.
Compte tenu de la chaîne de caractères chaîne de requête,
"?foo=Hello World!"
, le "Hello World!" partie des besoins de l'encodage de l'URL. La façon dont cela fonctionne est toute caractères 'spéciaux' obtenir leur valeur ASCII prises et converti en hexadécimal précédé par un'%'
. De sorte que la corde se convertir à"?foo=Hello%20World%21"
.Accept-Charset
seulement affecte le retour de l'encodage des pages, de ne pas la demander lui-même l'. Et j'ai été fait référence à tous les caractères dans la requête, et pas seulement le nom d'hôte, ou quelque autre partie.