2012-01-07 12 views
5

Sto tentando di inviare una richiesta POST a un'app Web. Sto usando il modulo mechanize (a sua volta un wrapper di urllib2). Ad ogni modo, quando provo a inviare una richiesta POST, ottengo UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128). Ho provato a mettere il unicode(string), il unicode(string, encoding="utf-8"), unicode(string).encode() ecc, niente ha funzionato - sia restituito l'errore di cui sopra, o il TypeError: decoding Unicode is not supportedInvia una richiesta POST non ASCII in Python?

ho guardato gli altri SO risposte a domande simili, ma nessuno ha aiutato.

Grazie in anticipo!

EDIT: Esempio che produce un errore:

prda = "šđćč" #valid UTF-8 characters 
prda # typing in python shell 
'\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' 
print prda # in shell 
šđćč 
prda.encode("utf-8") #in shell 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) 
unicode(prda) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) 
+0

mi sarebbe d'aiuto se hai mostrato un piccolo, ad esempio indipendente che produce l'errore. – ekhumoro

+0

@ekhumoro aggiunto esempio, spero che lo risolva –

risposta

7

Presumo che si sta utilizzando Python 2.x.

dato un oggetto unicode:

myUnicode = u'\u4f60\u597d' 

codificare utilizzando utf-8:

mystr = myUnicode.encode('utf-8') 

Si noti che è necessario specificare la codifica in modo esplicito. Di default userà (di solito) ASCII.

+0

Grazie per la risposta. Come faccio a convertirli in un oggetto unicode se ho una variabile stringa (invece della stringa)? È sepolto in profondità nel codice per me semplicemente aggiungere il prefisso 'u'' prima che la variabile stringa venga assegnata. –

0

Non è necessario per avvolgere i vostri caratteri in unicode chiamate, perché sono già codificati :) semmai, è necessario DE -Code per ottenere un oggetto unicode:

>>> s = '\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' # your string 
>>> s.decode('utf-8') 
u'\u0161\u0111\u0107\u010d' 
>>> type(s.decode('utf-8')) 
<type 'unicode'> 

Non so mechanize quindi non so esattamente se lo gestisce correttamente o meno, temo.

Cosa farei con una normale chiamata POST urllib2, sarebbe quella di utilizzare urlencode:

>>> from urllib import urlencode 
>>> postData = urlencode({'test': s }) # note I'm NOT decoding it 
>>> postData 
'test=%C5%A1%C4%91%C4%87%C4%8D' 
>>> urllib2.urlopen(url, postData) # etc etc etc 
1

Nel tuo esempio, si utilizza una stringa non Unicode letterale contenente caratteri non ASCII, che si traduce in prda diventa byte stringa.

Per ottenere ciò, python utilizza sys.stdin.encoding per codificare automaticamente la stringa. Nel tuo caso, questo significa che la stringa viene codificata come "utf-8".

Per convertire prda ad un unicode oggetto, è necessario per decodificare usando la codifica appropriata:

>>> print prda.decode('utf-8') 
šđćč 

Si noti che, in uno script o un modulo, non si può fare affidamento su di pitone di indovinare automaticamente la codifica - si avrebbe bisogno di delare esplicitamente la codifica nella parte superiore del file, in questo modo:

# -*- coding: utf-8 -*- 

Ogni volta che si verificano errori Unicode in Python 2, è molto spesso perché il codice è mixando stringhe di byte con stringhe Unicode. Quindi dovresti sempre verificare quale tipo di stringa sta causando l'errore, usando type(string).

Se l'oggetto stringa è <type 'str'>, ma è necessario unicode, decodifica utilizzando la codifica appropriata. Se l'oggetto stringa è <type 'unicode'>, ma è necessario byte, codificare utilizzando la codifica appropriata.

Problemi correlati