Tengo este:

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)

Y que provoca una excepción:

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)

y con 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)

Cómo puedo solucionarlo?

InformationsquelleAutor diegueus9 | 2010-06-25

4 Comentarios

  1. 58

    La urlencode biblioteca de espera de datos en str formato, y no tratar bien con los datos de Unicode, ya que no proporcionan una forma de especificar una codificación. Pruebe esto en su lugar:

    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': '[email protected]',
         '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)

    Lo que hizo fue asegurarse de que todos los datos se codifican en str el uso de UTF-8 antes de pasar el diccionario en la urlencode función.

    • Utiliza esto para el mensaje de error – unicodeencodeerror ‘ascii’ codec no se puede codificar caracteres u’\xb4′. Gracias
    • Esto es incorrecto y da el mismo error…
  2. 8

    Si usted está usando Django, echa un vistazo a Django la QueryDict clase, tiene un urlencode() método.

    O, por el auxiliar de la función en sí, usted puede utilizar urlencode. Que básicamente hace lo que se describe en las otras respuestas como una envoltura alrededor de la original urllib.codificar.

    • A pesar de que no me aviso op es el uso de django, yo estaba, y se encontró esta respuesta muy útil! Permítanme sugerir una edición para elaborar
    • ok, yo vine aquí, mientras que la búsqueda de django error. Que el contenedor de obras. Gracias
  3. 4

    El problema es que algunos de los valores en su mp3_data dict son cadenas unicode que no puede ser representado en la codificación predeterminada utilizada por urlencode() (mientras que otros son ASCII y otros son enteros). Usted puede solucionar este problema mediante la codificación de los valores antes de pasarlos a urlencode(). En la línea 14 de la /home/diegueus9/workspace/playku/src/client/playkud/service.py en make_request(), intenta cambiar esta:

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

    a este:

    data = urllib.urlencode(dict([k.encode('utf-8'),unicode(v).encode('utf-8')] for k,v in mp3_data.items()))
    • no todos los valores son cadenas, esto no funciona
    • Ellos no tienen que ser las cadenas para que esto funcione. Nota el uso de unicode() llamada a convertir cualquier enteros o cadenas simples para unicode antes de la codificación utf-8. Si realmente no funciona, yo estaría interesado en ver lo que el fracaso se ve como (¿estás seguro de que respondió a la respuesta correcta?)
  4. 3

    el problema es, que quieren echar una cadena unicode a una cadena, pero hay algunos personajes que tienen que ser convertidos a ASCII primera. Así que te aconsejaría usted para buscar cadenas de caracteres que no son ASCII y luego codificar de la siguiente manera:

    intentar cambiar por ejemplo donde v es una cadena unicode a:

    quote_plus(str(v))

    a

    quote_plus(str(v.encode("utf-8")))

    que debe ayudar a


    Si usted no tiene que usar Python 2.x, usted puede cambiar a Python 3.x, donde todas las cadenas unicode de forma predeterminada. Pero usted tiene que convertir algunas cosas para ella (que se podría automatizar esta parte o completo con 2to3).

    • Creo que, pero es un poco desagradable porque está en el núcleo de python :/
    • hmm.. yo no creo que sea el urllib la culpa. maybie hay en cualquier lugar de una cadena, que no codificados en ASCII. Puede usted buscar para que, o dar más de código?
    • si usted ve la traza se puede leer la excepción se produce en /usr/lib/python2.5/urllib.pyc
    • por cierto, yo no puedo usar python 3 🙁

Dejar respuesta

Please enter your comment!
Please enter your name here