2013-03-24 12 views
6

że pobrane tematu wiadomości poczty elektronicznej z wykorzystaniem modułów Pythona otrzymane ciągWymiana = o „ x”, a następnie dekodowania pytona

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

wiem, że łańcuch jest zakodowany w UTF-8 '. Python ma metodę wywoływaną na łańcuchach w celu dekodowania takich łańcuchów. Ale aby użyć metody, którą trzeba było zamienić na znak = z łańcuchem \x. Poprzez ręczną zamianę, a następnie wydrukowanie dekodowanego wynikowego łańcucha, otrzymuję ciąg سلام_کجائی, który jest dokładnie tym, czego chcę. Pytanie brzmi, jak mogę automatycznie wykonać wymianę? Odpowiedź wydaje się trudniejsza niż zwykłe użycie funkcji na łańcuchach takich jak funkcja zamiany.

Poniżej przedstawiłem kod, którego użyłem po ręcznej operacji?

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

Byłbym wdzięczny za każdy praktyczny pomysł.

Odpowiedz

7

Wystarczy dekodować go z quoted-printable dostać utf8 zakodowane bytestring:

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?' 

Następnie, jeśli to konieczne, z UTF-8 do unikodzie:

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, nie wiedziałem, że możesz to zrobić bezpośrednio. – svk

+0

Nie otrzymałem wyniku przez drukowanie s.decode ('quoted-printable') w moim systemie. Tylko drukowanie łańcucha unicode dało pożądany rezultat. – alexander

4

Ten rodzaj kodowania jest znany jako quoted-printable. Istnieje moduł Pythona do kodowania i dekodowania.

Masz rację, że jest to zwykłe cytowanie ciągów binarnych, więc musisz później zastosować kodowanie UTF-8. (Zakładając, że łańcuch jest w UTF-8, ale oczywiście, że wygląda poprawnie, chociaż nie znam języka..)

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. Lub po prostu 'r.decode ('quoted-printable'). Decode ('utf-8')' – RichieHindle

+0

Oba rozwiązania svk i RichieHindle działają doskonale. Chociaż ten ostatni jest wygodniejszy. – alexander

Powiązane problemy