1

当我尝试使用我的电子邮件解析器解码 shift_jis 编码的电子邮件并将其转换为 unicode 时,我收到一条错误消息,提示“UnicodeDecodeError:'shift_jis' 编解码器无法解码位置 2-3 中的字节:非法多字节序列”。代码和电子邮件可以在下面找到:

import email.header
import base64
import sys
import email

def getrawemail():
    line = ' '
    raw_email = ''
    while line:
        line = sys.stdin.readline()
        raw_email += line
    return raw_email

def getheader(subject, charsets):
    for i in charsets:
        if isinstance(i, str):
            encoding = i
            break
    if subject[-2] == "?=":
        encoded = subject[5 + len(encoding):len(subject) - 2]
    else:
        encoded = subject[5 + len(encoding):]
    return (encoding, encoded)

def decodeheader((encoding, encoded)):
    decoded = base64.b64decode(encoded)
    decoded = unicode(decoded, encoding)
    return decoded

raw_email = getrawemail()
msg = email.message_from_string(raw_email)
subject = decodeheader(getheader(msg["Subject"], msg.get_charsets()))
print subject

电子邮件: http: //pastebin.com/L4jAkm5R

我已经阅读了另一个 Stack Overflow 问题,这可能与 Unicode 和 shift_jis 的编码方式之间的差异有关(他们引用了这篇Microsoft 知识库文章)。如果有人知道我的代码中的什么可能导致它无法工作,或者如果这甚至可以合理地修复,我将非常感谢找出方法。

4

1 回答 1

1

从此字符串开始:

In [124]: msg['Subject']
Out[124]: '=?ISO-2022-JP?B?GyRCNS5KfSRLJEgkRiRiQmdAWiRKJCpDTiRpJDskLCQiJGo'

=?ISO-2022-JP?B?表示字符串是 ISO-2022-JP 编码的,然后是 base64 编码的。

In [125]: msg['Subject'].lstrip('=?ISO-2022-JP?B?')
Out[125]: 'GyRCNS5KfSRLJEgkRiRiQmdAWiRKJCpDTiRpJDskLCQiJGo'

不幸的是,试图逆转该过程会导致错误:

In [126]: base64.b64decode(msg['Subject'].lstrip('=?ISO-2022-JP?B?'))
TypeError: Incorrect padding

阅读这个SO 答案让我尝试将 '?=' 添加到字符串的末尾:

In [130]: print(base64.b64decode(msg['Subject'].lstrip('=?ISO-2022-JP?B?')+'?=').decode('ISO-2022-JP'))
貴方にとても大切なお知らせがあり

根据谷歌翻译,这可能翻译为“你知道有一个很重要”。

因此,似乎主题行已被截断。

于 2011-03-31T20:48:21.027 回答