python 中的 urlencode 错误
我有这个:
a = {'album': u'Metamorphine', 'group': 'monoku', 'name': u'Son Of Venus (Danny\xb4s Song)', 'artist': u'Leandra', 'checksum': '2836e33d42baf947e8c8adef48921f2f76fcb37eea9c50b0b59d7651', 'track_number': 8, 'year': '2008', 'genre': 'Darkwave', 'path': u'/media/data/musik/Leandra/2008. Metamorphine/08. Son Of Venus (Danny\xb4s Song).mp3', 'user_email': '[email protected]', 'size': 6624104}
data = urllib.urlencode(mp3_data)
这引发了一个异常:
Traceback (most recent call last):
File "playkud.py", line 44, in <module>
main()
File "playkud.py", line 29, in main
craw(args, options.user_email, options.group)
File "/home/diegueus9/workspace/playku/src/client/playkud/crawler/crawler.py", line 76, in craw
index(root, file, data, user_email, group)
File "/home/diegueus9/workspace/playku/src/client/playkud/crawler/crawler.py", line 58, in index
done = add_song(data[mp3file])
File "/home/diegueus9/workspace/playku/src/client/playkud/service.py", line 32, in add_song
return make_request(URL+'add_song/', data)
File "/home/diegueus9/workspace/playku/src/client/playkud/service.py", line 14, in make_request
data = urllib.urlencode(dict([k.encode('utf-8'),v] for k,v in mp3_data.items()))
File "/usr/lib/python2.5/urllib.py", line 1250, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 19: ordinal not in range(128)
并且使用 ipython (2.5):
In [7]: urllib.urlencode(a)
UnicodeEncodeError Traceback (most recent call last)
/home/diegueus9/<ipython console> in <module>()
/usr/lib/python2.5/urllib.pyc in urlencode(query, doseq)
1248 for k, v in query:
1249 k = quote_plus(str(k))
-> 1250 v = quote_plus(str(v))
1251 l.append(k + '=' + v)
1252 else:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 19: ordinal not in range(128)
我如何修复它?
I have this:
a = {'album': u'Metamorphine', 'group': 'monoku', 'name': u'Son Of Venus (Danny\xb4s Song)', 'artist': u'Leandra', 'checksum': '2836e33d42baf947e8c8adef48921f2f76fcb37eea9c50b0b59d7651', 'track_number': 8, 'year': '2008', 'genre': 'Darkwave', 'path': u'/media/data/musik/Leandra/2008. Metamorphine/08. Son Of Venus (Danny\xb4s Song).mp3', 'user_email': '[email protected]', 'size': 6624104}
data = urllib.urlencode(mp3_data)
And that raise an exception:
Traceback (most recent call last):
File "playkud.py", line 44, in <module>
main()
File "playkud.py", line 29, in main
craw(args, options.user_email, options.group)
File "/home/diegueus9/workspace/playku/src/client/playkud/crawler/crawler.py", line 76, in craw
index(root, file, data, user_email, group)
File "/home/diegueus9/workspace/playku/src/client/playkud/crawler/crawler.py", line 58, in index
done = add_song(data[mp3file])
File "/home/diegueus9/workspace/playku/src/client/playkud/service.py", line 32, in add_song
return make_request(URL+'add_song/', data)
File "/home/diegueus9/workspace/playku/src/client/playkud/service.py", line 14, in make_request
data = urllib.urlencode(dict([k.encode('utf-8'),v] for k,v in mp3_data.items()))
File "/usr/lib/python2.5/urllib.py", line 1250, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 19: ordinal not in range(128)
and with ipython (2.5):
In [7]: urllib.urlencode(a)
UnicodeEncodeError Traceback (most recent call last)
/home/diegueus9/<ipython console> in <module>()
/usr/lib/python2.5/urllib.pyc in urlencode(query, doseq)
1248 for k, v in query:
1249 k = quote_plus(str(k))
-> 1250 v = quote_plus(str(v))
1251 l.append(k + '=' + v)
1252 else:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 19: ordinal not in range(128)
How i can fix it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
urlencode
库需要str
格式的数据,并且不能很好地处理 Unicode 数据,因为它不提供指定编码的方法。试试这个:我所做的是确保在将字典传递到
urlencode
函数之前,所有数据都使用 UTF-8 编码为str
。The
urlencode
library expects data instr
format, and doesn't deal well with Unicode data since it doesn't provide a way to specify an encoding. Try this instead:What I did was ensure that all data is encoded into
str
using UTF-8 before passing the dictionary into theurlencode
function.如果您使用 Django,请查看 Django 的 QueryDict 类,它有一个 urlencode() 方法。
或者,对于辅助函数本身,您可以使用
urlencode
。它基本上执行其他答案中描述的操作,作为原始 urllib.encode 的包装器。If you are using Django, take a look at Django's QueryDict class, it has a urlencode() method.
Or, for the helper function itself you may use
urlencode
. It basically does what is described in the other answers as a wrapper around the original urllib.encode.问题是 mp3_data 字典中的某些值是 unicode 字符串,无法以
urlencode()
使用的默认编码表示(而其他值是 ASCII,还有一些是整数)。您可以通过在将这些值传递给urlencode()
之前对其进行编码来解决此问题。在 /home/diegueus9/workspace/playku/src/client/playkud/service.py 的第 14 行,在make_request()
中,尝试将以下内容更改为:
The problem is that some of the values in your mp3_data dict are unicode strings that can't be represented in the default encoding used by
urlencode()
(while others are ASCII and still others are integers). You can fix this by encoding those values before passing them tourlencode()
. On line 14 of /home/diegueus9/workspace/playku/src/client/playkud/service.py, inmake_request()
, try changing this:to this:
问题是,您想要将 unicode 字符串转换为字符串,但有些字符必须首先转换为 ASCII。因此,我建议您搜索非 ASCII 的字符串,然后按如下方式对它们进行编码:
尝试将 例如 更改为:将 v 是 unicode 字符串更改
为
:应该有帮助
如果您不必使用Python 2.x,您可以切换到Python 3.x,默认情况下所有字符串都是unicode。但是你必须为其转换一些东西(你可以使用 2to3)。
the problem is, that you want to cast a unicode-string to a string, but there are some characters that have to be converted to ASCII first. So I would advice you to search for strings that are not ASCII and then encode them as follows:
try to change for example where v is a unicode-string to:
to
that should help
If you do not have to use Python 2.x, you could switch to Python 3.x, where all strings are unicode by default. But you have to convert some things for it (you could automate this party or full with 2to3).