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 字符串中,显然最终得到了错误的结果。
我想用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 字符串中,显然最终得到了错误的结果。