Question Quelle est la bonne façon de coder les caractères Unicode par URL?


Je connais le schéma non standard% uxxxx mais cela ne semble pas être un choix judicieux puisque le schéma a été rejeté par le W3C.

Quelques exemples intéressants:

Le caractère du coeur Si je tape ceci dans mon navigateur:

http://www.google.com/search?q=

Puis copiez et collez-le, je vois cette URL

http://www.google.com/search?q=%E2%99%A5

ce qui donne l'impression que Firefox (ou Safari) le fait.

urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'

ce qui est logique, sauf pour les choses qui ne peuvent pas être encodées en latin-1, comme le triple point.

Si je tape l'URL

http://www.google.com/search?q=…

dans mon navigateur puis copier-coller, je reçois

http://www.google.com/search?q=%E2%80%A6

arrière. Ce qui semble être le résultat de faire

urllib.quote_plus(x.encode("utf-8"))

ce qui est logique puisque ... ne peut pas être encodé en latin-1.

Mais alors, je ne comprends pas comment le navigateur sait décoder avec UTF-8 ou Latin-1.

Puisque cela semble être ambigu:

In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'

fonctionne, donc je ne sais pas comment le navigateur détermine si décoder avec UTF-8 ou Latin-1.

Quelle est la bonne chose à faire avec les caractères spéciaux que je dois traiter?


100
2018-05-26 21:18


origine


Réponses:


Je coderais toujours en UTF-8. Du Page Wikipedia sur le codage en pourcentage:

La syntaxe générique de l'URI exige que les nouveaux schémas d'URI assurant la représentation des données de caractères dans un URI doivent, en fait, représenter des caractères de l'ensemble non réservé sans traduction et convertir tous les autres caractères en octets selon UTF-8. encoder ces valeurs en pourcentage. Cette exigence a été introduite en janvier 2005 avec la publication de RFC 3986. Les schémas URI introduits avant cette date ne sont pas affectés.

Il semble que, comme il existait d’autres méthodes acceptées de codage d’URL par le passé, les navigateurs tentent plusieurs méthodes de décodage d’un URI, mais si vous utilisez l’encodage, vous devez utiliser UTF-8.


57
2018-05-27 02:18



La règle générale semble être que les navigateurs encodent les réponses de formulaire en fonction du type de contenu de la page à partir de laquelle le formulaire a été diffusé. C'est une supposition que si le serveur nous envoie "text / xml; charset = iso-8859-1", alors il attend des réponses dans le même format.

Si vous entrez simplement une URL dans la barre d’URL, alors le navigateur n’a pas de page de base sur laquelle travailler et il suffit donc de deviner. Donc, dans ce cas, il semble faire utf-8 tout le temps (puisque vos deux entrées ont produit des valeurs de forme de trois octets).

La triste vérité est que AFAIK il n'y a pas de norme pour quel caractère définir les valeurs dans une chaîne de requête, ou tout caractère dans l'URL, doit être interprété comme. Au moins dans le cas des valeurs dans la chaîne de requête, il n'y a aucune raison de supposer qu'elles ont nécessairement faire correspondent aux caractères.

C'est un problème connu que vous devez dire à votre structure de serveur quel jeu de caractères vous attendez à ce que la chaîne de requête soit encodée comme par exemple, dans Tomcat, vous devez appeler request.setEncoding () ou une méthode similaire. avant vous appelez l'une des méthodes request.getParameter (). Le manque de documentation sur ce sujet reflète probablement le manque de conscience du problème chez de nombreux développeurs. (Je demande régulièrement aux personnes interrogées Java quelle est la différence entre un lecteur et un flux InputStream, et obtiens régulièrement des résultats vides)


9
2018-05-27 22:13



IRI (RFC 3987) est la dernière norme qui remplace l’URI / l’URL (RFC 3986 et plus anciennes). URI / URL ne supporte pas nativement Unicode (eh bien, RFC 3986 ajoute des dispositions pour les futurs protocoles basés sur URI / URL pour le prendre en charge, mais ne met pas à jour les RFC antérieurs). Le schéma "% uXXXX" est une extension non standard pour autoriser Unicode dans certaines situations, mais il n'est pas universellement implémenté par tout le monde. IRI, quant à lui, supporte entièrement Unicode et exige que le texte soit codé en UTF-8 avant d’être encodé en pourcentage.


7
2018-06-19 22:22



Les IRI ne remplacent pas les URI, car seuls les URI (effectivement, ASCII) sont autorisés dans certains contextes, y compris HTTP.

Au lieu de cela, vous spécifiez un IRI et il se transforme en URI lorsque vous sortez sur le fil.


5
2018-04-14 05:31



La première question est quels sont vos besoins? L'encodage UTF-8 est un très bon compromis entre la prise de texte créée avec un éditeur bon marché et la prise en charge d'une grande variété de langues. En ce qui concerne le navigateur identifiant le codage, la réponse (du serveur Web) devrait indiquer au navigateur le codage. Néanmoins, la plupart des navigateurs tenteront de deviner, car cela est inexistant ou erroné dans de nombreux cas. Ils devinent en lisant une certaine quantité du flux de résultats pour voir s'il y a un caractère qui ne rentre pas dans l'encodage par défaut. Actuellement, tous les navigateurs (? Je ne l'ai pas vérifié, mais c'est assez vrai), utilisez utf-8 par défaut.

Donc, utilisez utf-8 sauf si vous avez une raison impérieuse d'utiliser l'un des nombreux autres schémas d'encodage.


0
2018-05-27 16:08