2013-03-24 14 views
6

Presi oggetto di un messaggio di posta elettronica utilizzando moduli Python e ricevuti stringaSostituzione = con ' x' e poi decodifica in python

'=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?=' 

So che la stringa è codificata in 'utf-8'. Python ha un metodo chiamato sulle stringhe per decodificare tali stringhe. Ma per usare il metodo avevo bisogno di sostituire il segno = con la stringa \x. Con l'interscambio manuale e quindi stampando la stringa risultante decodificata, ottengo la stringa سلام_کجائی che è esattamente quello che voglio. La domanda è come posso fare lo scambio automaticamente? La risposta sembra più difficile del semplice utilizzo di funzioni su stringhe come la funzione di sostituzione.

Di seguito ho riportato il codice che ho utilizzato dopo l'operazione manuale?

r='\xD8\xB3\xD9\x84\xD8\xA7\xD9\x85_\xDA\xA9\xD8\xAC\xD8\xA7\xD8\xA6\xDB\x8C' 
print r.decode('utf-8') 

Apprezzerei qualsiasi idea praticabile.

risposta

7

Basta decodificarlo da quoted-printable per ottenere bytestring utf8-encoded:

In [35]: s = '=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?=' 
In [36]: s.decode('quoted-printable') 
Out[36]: '\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85_\xda\xa9\xd8\xac\xd8\xa7\xd8\xa6\xdb\x8c?' 

Poi, se necessario, da UTF-8 a Unicode:

In [37]: s.decode('quoted-printable').decode('utf8') 
Out[37]: u'\u0633\u0644\u0627\u0645_\u06a9\u062c\u0627\u0626\u06cc?' 

 

In [39]: print s.decode('quoted-printable') 
سلام_کجائی? 
+0

Huh, non mi ero reso conto che avresti potuto farlo direttamente. – svk

+0

Non ho ottenuto il risultato semplicemente stampando s.decode ('quoted-printable') nel mio sistema. Solo la stampa della stringa unicode ha dato il risultato desiderato. – alexander

4

Questo tipo di codifica è noto come quotato-stampabile. C'è un modulo Python per eseguire la codifica e la decodifica.

Hai ragione che è solo una pura citazione di stringhe binarie, quindi è necessario applicare la decodifica UTF-8 in seguito. (Supponendo che la stringa è in UTF-8, naturalmente, ma che sembra corretta anche se non conosco la lingua..)

import quopri 

print quopri.decodestring("'=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?='").decode("utf-8") 
+1

+1. O semplicemente 'r.decode ('quoted-printable'). Decode ('utf-8')' – RichieHindle

+0

Le soluzioni svk e RichieHindle funzionano perfettamente. Sebbene quest'ultimo sia più conveniente. – alexander