python中的urlencode错误

python中的urlencode错误,python,encoding,urlencode,Python,Encoding,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', '

我有这个:

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': 'diegueus9@gmail.com', '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)
回溯(最近一次呼叫最后一次):
文件“playkud.py”,第44行,在
main()
文件“playkud.py”,第29行,主
craw(args,options.user\u电子邮件,options.group)
文件“/home/diegueus9/workspace/playku/src/client/playkud/crawler/crawler.py”,第76行,craw
索引(根、文件、数据、用户\电子邮件、组)
文件“/home/diegueus9/workspace/playku/src/client/playkud/crawler/crawler.py”,第58行,在索引中
完成=添加歌曲(数据[MP3文件])
文件“/home/diegueus9/workspace/playku/src/client/playkud/service.py”,第32行,添加歌曲
返回发出请求(URL+“添加歌曲/”,数据)
文件“/home/diegueus9/workspace/playku/src/client/playkud/service.py”,第14行,在make_请求中
data=urllib.urlencode(dict([k.encode('utf-8'),v]表示k,v在mp3_data.items()中)
文件“/usr/lib/python2.5/urllib.py”,第1250行,URL编码
v=报价加上(str(v))
UnicodeEncodeError:“ascii”编解码器无法对位置19中的字符u'\xb4'进行编码:序号不在范围内(128)
和ipython(2.5):

[7]中的
:urllib.urlencode(a)
UnicodeEncodeError回溯(最近一次呼叫最后一次)
/home/diegueus9/in()
/urlencode中的usr/lib/python2.5/urllib.pyc(查询,doseq)
1248对于查询中的k,v:
1249 k=报价加上(str(k))
->1250 v=报价加上(str(v))
1251 l.附加(k+'='+v)
1252其他:
UnicodeEncodeError:“ascii”编解码器无法对位置19中的字符u'\xb4'进行编码:序号不在范围内(128)

如何修复它?

问题是,您希望将unicode字符串转换为字符串,但有些字符必须先转换为ASCII。因此,我建议您搜索非ASCII的字符串,然后将其编码如下:

尝试将例如中的v作为unicode字符串更改为:

quote_plus(str(v))

这应该会有帮助



如果不必使用Python2.x,可以切换到Python3.x,其中所有字符串默认为unicode。但是您必须为它转换一些东西(您可以使这个聚会自动化或完全自动化)。

urlencode库需要
str
格式的数据,并且不能很好地处理Unicode数据,因为它没有提供指定编码的方法。请尝试以下方法:

mp3_data = {'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': 'diegueus9@gmail.com',
     'size': 6624104}

str_mp3_data = {}
for k, v in mp3_data.iteritems():
    str_mp3_data[k] = unicode(v).encode('utf-8')
data = urllib.urlencode(str_mp3_data)

我所做的是确保在将字典传递到
urlencode
函数之前,使用UTF-8将所有数据编码到
str

问题是,mp3\u数据dict中的一些值是unicode字符串,无法在
urlencode()使用的默认编码中表示(其他的是ASCII,还有一些是整数)。在将这些值传递到
urlencode()
之前,可以通过对这些值进行编码来解决此问题。在/home/diegueus9/workspace/playku/src/client/playkud/service.py的第14行,在
make_request()
中,尝试更改以下内容:

data = urllib.urlencode(dict([k.encode('utf-8'),v] for k,v in mp3_data.items()))
为此:

data = urllib.urlencode(dict([k.encode('utf-8'),unicode(v).encode('utf-8')] for k,v in mp3_data.items()))

如果您使用的是Django,请查看Django的QueryDict类,它有一个urlencode()方法


或者,对于helper函数本身,您可以使用它。它基本上实现了其他答案中描述的原始urllib.encode的包装。

我认为这有点令人讨厌,因为它是python的核心:/hmm。我不认为这是urllib的错。可能有一个字符串没有被编码为ASCII。您能理解吗或者提供更多代码?如果您看到回溯,您可以阅读异常是在/usr/lib/python2.5/urllib.pycby中提出的。顺便说一句,我不能使用python 3:(它们不必是字符串才能工作。注意我使用的unicode()在编码为utf-8之前,调用将任何整数或纯字符串转换为unicode。如果它真的不起作用,我想看看失败的情况(您确定回答了正确的答案吗?)虽然我没有注意到op正在使用django,但我确实注意到了,并且发现这个答案非常有用!让我建议对Detaileok进行编辑,我是在搜索django错误时来到这里的。该包装器工作正常。感谢您提供错误消息-unicodeencodeerror'ascii'编解码器无法对字符u'\xb4'进行编码。谢谢
data = urllib.urlencode(dict([k.encode('utf-8'),v] for k,v in mp3_data.items()))
data = urllib.urlencode(dict([k.encode('utf-8'),unicode(v).encode('utf-8')] for k,v in mp3_data.items()))