Conosco lo schema% uxxxx non standard, ma non mi sembra una scelta saggia dal momento che lo schema è stato rifiutato dal W3C.Qual è il modo corretto per codificare URL caratteri Unicode?
Alcuni esempi interessanti:
Il carattere di cuore. Se scrivo questo nel mio browser:
http://www.google.com/search?q=♥
quindi copiare e incollare, vedo questo URL
http://www.google.com/search?q=%E2%99%A5
che fa sembrare come Firefox (o Safari) sta facendo questo.
urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'
che ha senso, tranne che per le cose che non possono essere codificate in Latin-1, come il carattere del punto triplo.
…
Se scriv l'URL
http://www.google.com/search?q=…
nel mio browser quindi copiare e incollare, ottengo
http://www.google.com/search?q=%E2%80%A6
indietro. Quale sembra essere il risultato di fare
urllib.quote_plus(x.encode("utf-8"))
che ha senso poiché ... non può essere codificato con Latin-1.
Ma poi non mi è chiaro come il browser sa se decodificare con UTF-8 o Latin-1.
Dal momento che questo sembra essere ambiguo:
In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'
opere, quindi non so come il browser capisce se per decodificare quello con UTF-8 o Latin-1.
Qual è la cosa giusta da fare con i caratteri speciali che devo trattare?
Entrambi i tuoi esempi sono codificati come UTF-8. Il primo certamente non Latin-1, dato che è lungo tre byte ... –
% E2% 99% A5 è esadecimale per i valori di byte di [il "vestito cuore nero" in UTF-8] (http: // www. ltg.ed.ac.uk/~richard/utf-8.cgi?input=E2+99+A5&mode=bytes). Quel cuore nero non fa parte del set di caratteri [Latin-1] (http://en.wikipedia.org/wiki/ISO/IEC_8859-1). –
Per vedere in modo preciso come e cosa codifica un browser (e molte altre informazioni utili), utilizzare gli strumenti per sviluppatori incorporati nella maggior parte dei browser moderni o ottenere un debugger HTTP gratuito come [Fiddler] (http: //www.telerik .com/violinista). –