Python: декодировать строки - PullRequest
0 голосов
/ 07 февраля 2011

Может кто-нибудь дать совет, как декодировать эти строки? Они являются частью электронной почты.

=?Windows-1251?B?ICLRLcvu5Obo8fLo6iI?=

=?koi8-r?B?5tLPzM/XwSDtwdLJzsEg98nUwczYxdfOwQ?=

=?Windows-1251?B?1PDu6+7i4CDM4PDo7eAgwujy4Ov85eLt4A?=

Вероятно, необходимо взять внутреннюю часть строки ICLRLcvu5Obo8fLo6iI, а затем base64.decodestring(string).decode('windows-1251') Такой подход работает в большинстве случаев, но не с этими строками: (

base64.decodestring('ICLRLcvu5Obo8fLo6iI')
---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)

/home/alecs/<ipython console> in <module>()

/usr/lib/python2.6/base64.pyc in decodestring(s)
    319 def decodestring(s):
    320     """Decode a string."""
--> 321     return binascii.a2b_base64(s)
    322 
    323 

Error: Incorrect padding

Ответы [ 2 ]

4 голосов
/ 07 февраля 2011
test = [
    '=?Windows-1251?B?ICLRLcvu5Obo8fLo6iI?=',
    '=?koi8-r?B?5tLPzM/XwSDtwdLJzsEg98nUwczYxdfOwQ?=',
    '=?Windows-1251?B?1PDu6+7i4CDM4PDo7eAgwujy4Ov85eLt4A?='
]

def decodeStr(s):
    s = s.split('?')
    enc = s[1]
    dat = s[3]

    return (dat+'===').decode('base-64').decode(enc)

for t in test:
    print decodeStr(t)
2 голосов
/ 07 февраля 2011

Кажется, что эти строки были закодированы неправильно, без дополнения в конце. Строка base64 всегда должна быть кратна 4 символам. Символ заполнения равен =, вы можете добавить его вручную, если длина не кратна 4. Вот результаты для ваших примеров:

>>> print "ICLRLcvu5Obo8fLo6iI=".decode ('base-64').decode ('Windows-1251')
 "С-Лоджистик"
>>> print "5tLPzM/XwSDtwdLJzsEg98nUwczYxdfOwQ==".decode ('base-64').decode ('koi8-r')
Фролова Марина Витальевна
>>> print "1PDu6+7i4CDM4PDo7eAgwujy4Ov85eLt4A==".decode ('base-64').decode ('Windows-1251')
Фролова Марина Витальевна

Обратите внимание на добавление знаков 1, 2 и 2 '=' соответственно.

...