Python imaplib .search 邮件主题中文出错

Python imaplib .search email subject Chinese got error

我想用imaplib 来搜索主题包含中文的特定邮件。 我收到这样的错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

所以我使用 .encode 编码为 'UTF-8',但我什么也没得到。打印出来的是

0
[]

正确答案应该是 71,我通过邮件在收件箱中搜索到的。 这是我的代码:

import imaplib,email
host = 'imap.263.net'
user = '***@***'
psw = '*****'
count = 0
con = imaplib.IMAP4(host,143)
con.login(user,psw)
con.select('INBOX',readonly =True)
eva = '日报'
# eva = eva.encode('utf-8') 
resp,liujf = con.search('UTF-8','SUBJECT','%s'%eva, 'Since','01-Feb-2018')
items = liujf[0].split()
print(len(items))
print(items)

我猜应该是unicode问题。我该如何解决?

我认为你应该先解码再编码中文 literals.If 我们将它解释为 latin-1 编码,然后你先解码再编码。 例如- eva.decode('latin-1').encode('utf-8')

您正在传递原始 Unicode 字符串,您应该将字符串作为 UTF-8 字节序列传递。您甚至将其标记为 UTF-8!这表明您可能想要了解差异。

改变

'%s'%eva

eva.encode('utf-8')

更多背景知识,请阅读https://www.unicode.org/faq/utf_bom.html#UTF8 and/or https://nedbatchelder.com/text/unipain.html

构造 '%s'%string 只是一种丑陋且不合常理的表达方式 string 但这里实际上是一个错误: '%s'%string.encode('utf-8') 生成一个字节字符串,然后将其插入一个 Unicode 字符串这会产生完全错误的结果。观察:

>>> eva = '日报'
>>> eva.encode('utf-8')              # correct
b'\xe6\x97\xa5\xe6\x8a\xa5'
>>> '%s'%eva.encode('utf-8')         # incorrect
"b'\xe6\x97\xa5\xe6\x8a\xa5'"
>>> b'%s'%eva.encode('utf-8')        # correct but terribly fugly
b'\xe6\x97\xa5\xe6\x8a\xa5'

注意 '%s'%eva.encode('utf-8') 如何获取编码的字节字符串并将其 back 转换为 Unicode 表示形式。 commented-out 行显示您尝试了 eva = eva.encode('utf-8') 但由于不必要的 % 插值到 Unicode 字符串中,显然最终得到了错误的结果。