106 votes

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

Je sais que de la non-standard %uxxxx régime, mais qui ne semble pas être un choix judicieux puisque le système a été rejetée par le W3C.

Quelques exemples intéressants:

Le caractère du coeur. Si je tape cette adresse dans mon navigateur:

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

Puis copier et coller, je vois cette URL

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

qui rend semblent comme Firefox ou Safari) est en train de faire cela.

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

ce qui est logique, sauf pour les choses qui ne peuvent pas être encodé en Latin-1, comme le triple caractère de point.

Si je tape l'URL

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

dans mon navigateur, puis copier et coller, j'obtiens

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

de retour. Ce qui semble être le résultat des

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

qui est logique, puisque ... ne peut pas être codé avec le Latin-1.

Mais alors il n'est pas clair pour moi comment le navigateur sait si à décoder avec l'encodage UTF-8 ou en Latin-1.

Depuis ce qui 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 le décoder avec l'encodage UTF-8 ou en Latin-1.

Quelle est la bonne chose à faire avec les caractères spéciaux j'ai besoin de traiter?

64voto

John Biesnecker Points 2138

Je serais toujours encoder en UTF-8. À partir de la page de Wikipédia sur le pourcentage d'encodage:

Le générique de la syntaxe d'URI mandats que les nouveaux modèles d'URI qui fournissent pour la représentation des données de caractère dans un URI doit, en effet, représentent les personnages de la sans réserve à l'ensemble, sans traduction, et le convertir en tous les autres caractères d'octets selon l'UTF-8, et puis pour cent-encoder ces valeurs. Cette exigence a été introduit en janvier 2005 avec la publication de la RFC 3986. Modèles d'URI introduite avant cette date ne sont pas concernés.

Il semble que parce qu'il y avait d'autres façons de faire de l'encodage de l'URL dans le passé, les navigateurs essayer plusieurs méthodes de décodage d'un URI, mais si vous êtes la pour faire de l'encodage, vous devriez utiliser l'UTF-8.

9voto

araqnid Points 33350

La règle générale semble être que les navigateurs encoder sous forme de réponses selon le type de contenu de la page, le formulaire a été servi. C'est une supposition que si le serveur nous envoie "text/xml; charset=iso-8859-1", alors qu'ils attendent des réponses dans le même format.

Si vous êtes juste en entrant l'URL dans la barre d'URL, puis le navigateur ne dispose pas d'une page de base de travail et par conséquent d'un peu de deviner. Donc, dans ce cas, il semble être de faire de l'utf-8 tout le temps (puisque les deux entrées a produit trois-octet valeurs d'un formulaire).

La triste vérité est que, autant que je sache, il n'y a pas de norme pour ce jeu de caractères les valeurs dans une chaîne de requête, ou en effet tous les caractères dans l'URL, doit être interprétée comme. Au moins dans le cas de valeurs dans la chaîne de requête, il n'y a aucune raison de supposer qu'ils nécessairement ne correspondent à des caractères.

C'est un problème connu que vous avez à dire à votre infrastructure de serveur le jeu de caractères que vous attendez la chaîne de requête pour être codée sous la forme--- par exemple, dans Tomcat, vous devez appeler le demande.setEncoding() (ou une méthode similaire) avant d'appeler de la demande.getParameter() méthodes. La rareté de la documentation sur ce sujet, probablement le reflet de l'absence de prise de conscience du problème parmi de nombreux développeurs. (J'ai régulièrement demander Java personnes interrogées quelle est la différence entre un Lecteur et d'un InputStream est, et reçois régulièrement des regards blanc)

8voto

Remy Lebeau Points 130112

IRI (RFC 3987) est la dernière norme qui remplace l'URI/URL (RFC 3986 et plus âgés) des normes. URI/URL ne supporte pas l'Unicode (bien, RFC 3986 ajoute des dispositions pour l'avenir de l'URI/URL basée sur des protocoles pour la soutenir, mais ne pas mettre à jour le passé Rfc). Le "%uXXXX" est un non-extension standard pour permettre l'Unicode dans certaines situations, mais n'est pas universellement mis en œuvre par tout le monde. IRI, d'autre part, prend entièrement en charge l'Unicode, et exige que le texte codé en UTF-8 avant d'être ensuite pour cent codé.

6voto

Mark Nottingham Points 1592

IRIs ne remplacent pas les URIs, parce que seulement les URIs (effectivement, ASCII) sont autorisées dans certains contextes--y compris HTTP.

Au lieu de cela, vous spécifiez un IRI et il est transformé en un URI en sortant sur le fil.

0voto

Pat O Points 587

La première question est de savoir quels sont vos besoins? L'encodage UTF-8 est un assez bon compromis entre la prise de texte créé avec un bon éditeur et de soutien pour un large éventail de langues. En ce qui concerne le navigateur de l'identification de l'encodage, la réponse (à partir du serveur web) doit indiquer au navigateur de l'encodage. Encore que la plupart des navigateurs tenter de deviner, parce que c'est soit manquants ou faux, dans de nombreux cas. Ils deviner à la lecture de certains montant des flux de résultat pour voir si il y a un personnage qui ne rentre pas dans le codage par défaut. Actuellement tous les navigateurs(? Je n'ai pas vérifié, mais c'est assez proche de la vraie) utiliser l'utf-8 par défaut.

Donc, utiliser l'utf-8, sauf si vous avez une raison impérieuse d'utiliser l'un des nombreux autres systèmes de codage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X