3

Hello i was wondering if you know any other way to encode a string to a url-safe, because urllib.quote is doing it wrong, the output is different than expected:

If i try

urllib.quote('á')

i get

'%C3%A1'

But thats not the correct output, it should be %E1

As demostrated by the tool provided here this site

And this is not me being difficult, the incorrect output of quote is preventing the browser to found resources, if i try

urllib.quote('\images\á\some file.jpg')

And then i try with the javascript tool i mentioned i get this strings respectively

%5Cimages%5C%C3%A1%5Csome%20file.jpg

%5Cimages%5C%E1%5Csome%20file.jpg

Note how is almost the same but the url provided by quote doesn't work and the other one it does. I tried messing with encode('utf-8) on the string provided to quote but it does not make a difference. I tried with other spanish words with accents and the ñ they all are differently represented.

Is this a python bug? Do you know some module that get this right?

Guillermo Siliceo Trueba
  • 4,251
  • 5
  • 34
  • 47

5 Answers5

7

According to RFC 3986, %C3%A1 is correct. Characters are supposed to be converted to an octet stream using UTF-8 before the octet stream is percent-encoded. The site you link is out of date.

See Why does the encoding's of a URL and the query string part differ? for more detail on the history of handling non-ASCII characters in URLs.

Community
  • 1
  • 1
Anomie
  • 92,546
  • 13
  • 126
  • 145
3

Ok, got it, i have to encode to iso-8859-1 like this

word = u'á'
word = word.encode('iso-8859-1')
print word
Guillermo Siliceo Trueba
  • 4,251
  • 5
  • 34
  • 47
1

Python is interpreted in ASCII by default, so even though your file may be encoded differently, your UTF-8 char is interpereted as two ASCII chars.

Try putting a comment as the first of second line of your code like this to match the file encoding, and you might need to use u'á' also.

# coding: utf-8
BudgieInWA
  • 2,184
  • 1
  • 17
  • 31
0

What about using unicode strings and the numeric representation (ord) of the char?

>>> print '%{0:X}'.format(ord(u'á'))
%E1
  • It's a hack, but a hack may be required for a website that still requires ISO-8859-1. Most webservers are now compliant with UTF-8, as assumed by urllib. – krubo Jun 14 '11 at 03:22
  • 1
    Works but looks like black magic, and it doesnt work with more than 1 character, and looping over all my content just doesnt seem like a good idea. – Guillermo Siliceo Trueba Jun 14 '11 at 03:43
0

In this question it seems some guy wrote a pretty large function to convert to ascii urls, thats what i need. But i was hoping there was some encoding tool in the std lib for the job.

Community
  • 1
  • 1
Guillermo Siliceo Trueba
  • 4,251
  • 5
  • 34
  • 47