【问题标题】:python how to convert str to unicode ( persion )?python如何将str转换为unicode(波斯语)?
【发布时间】:2014-08-06 19:44:02
【问题描述】:

这个字符串是邮件的主题。我通过 imaplib 得到这个字符串。 这个字符串的类型是“str”。

谢谢!

#-*- coding: utf-8 -*-
import imaplib
from email.parser import HeaderParser

conn = imaplib.IMAP4('imap.gmail.com')
conn.login('myuser', 'my_pass')
conn.select()
conn.search(None, 'ALL')  # returns a nice list of messages...

data = conn.fetch(1, '(BODY[HEADER])')

header_data = data[1][0][1]

parser = HeaderParser()
msg = parser.parsestr(header_data)
print repr(msg['subject'].decode('utf-8'))

结果:

u'=?UTF-8?B?V2VsY29tZSB0byBBdGxhc01haWw=?='

【问题讨论】:

    标签: python unicode utf-8 decode persian


    【解决方案1】:

    使用 email.header 包中的 decode_headermake_header 函数处理标头,然后将标头对象转换为 unicode:

    from email.header import make_header, decode_header
    header = make_header(decode_header(msg['subject']))
    unicode_header = unicode(header)
    print repr(unicode_header)  # prints: u'Welcome to AtlasMail'
    

    【讨论】:

    • 绝对正确,但仅适用于英文单词。它不适用于波斯语:(
    • 如果标头编码正确,它应该可以工作,但这取决于生成消息的客户端。
    【解决方案2】:

    电子邮件主题中非 ascii 字符的编码在 RFC-1342 中描述 - 如您所见,在这种情况下,您的 utf-8 字节是 base 64 编码的。

    所以,要真正阅读这篇文章,你可以做一些事情:

    import base64, quopri
    try:
        encoding, enc_type, subject = msg["subject"].split("?", 2)
    except ValueError:
        subject = msg["subject"].decode("utf-8")
        enc_type = "N/A"
    if enc_type == "B":
        subject = base64.decodestring(subject).decode(encoding.lower())
    elif enc_type == "Q":
        subject = quopri.decodestring(subject).decode(encoding.lower())
    

    【讨论】:

    • 不够,完成的代码是:def convert_to_unicode(string): print string list_word = string.split() result = '' for word in list_word: try: a, encoding, enc_type, subject, b = word.split("?") except ValueError: subject = msg["subject"].decode("utf-8") enc_type = "N/A" if enc_type == "B": subject = base64.decodestring( subject).decode(encoding.lower()) elif enc_type == "Q": subject = quopri.decodestring(subject).decode(encoding.lower()) result += subject + ' ' 返回结果
    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2015-07-18
    • 2018-02-01
    • 2018-06-06
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多