Conozco el esquema% uxxxx no estándar pero eso no parece una buena elección ya que el esquema ha sido rechazado por el W3C.¿Cuál es la forma correcta de codificación URL de caracteres Unicode?
Algunos ejemplos interesantes:
El carácter de corazón. si escribo esto en mi navegador:
http://www.google.com/search?q=♥
luego copiar y pegar, veo este URL
http://www.google.com/search?q=%E2%99%A5
lo que hace que parezca que Firefox (o Safari) está haciendo esto.
urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'
que tiene sentido, a excepción de las cosas que no se pueden codificar en Latin-1, como el carácter de punto triple.
…
Si escribo la URL
http://www.google.com/search?q=…
en mi navegador y luego copiar y pegar, me sale
http://www.google.com/search?q=%E2%80%A6
espalda. Que parece ser el resultado de hacer
urllib.quote_plus(x.encode("utf-8"))
cual tiene sentido ya que ... no puede ser codificado con Latin-1.
Pero no está claro para mí cómo sabe el navegador si decodificar con UTF-8 o Latin-1.
Dado que este parece ser ambigua:
In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'
obras, por lo que no saben cómo calcula el navegador a cabo ya sea para decodificar que con UTF-8 o Latin-1.
¿Qué hay que hacer con los personajes especiales con los que tengo que lidiar?
Ambos ejemplos están codificados como UTF-8. El primero ciertamente no es Latin-1, dado que tiene tres bytes de longitud ... –
% E2% 99% A5 es hexadecimal para los valores de byte de [el "traje de corazón negro" en UTF-8] (http: // www. ltg.ed.ac.uk/~richard/utf-8.cgi?input=E2+99+A5&mode=bytes). Ese corazón negro no es parte del conjunto de caracteres [Latin-1] (http://en.wikipedia.org/wiki/ISO/IEC_8859-1). –
Para ver exactamente cómo y qué navegador está codificando (y mucha otra información útil), use las herramientas de desarrollador integradas en los navegadores más modernos o obtenga un depurador HTTP gratuito como [Fiddler] (http: //www.telerik .com/fiddler). –