某个Python API会返回u'J\xe4rvenp\xe4\xe4'
作为结束语Järvenpää。
其中\ xe4 ==ä
然后我调用email.header将此字段添加到要打印的标题中。
email.header
在尝试解码变音符号时会失败:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/email/header.py", line 73, in decode_header
header = str(header)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128)
我尝试过几件事:
# -*- coding: utf-8 -*-
到header.py unicode()
.encode('utf-8')
没有人解决了这个问题。我做错了什么?我想,解决方案不会涉及修改header.py
(核心Python模块)。
Python版本:2.7.10
更新
Header()未直接实例化。而是我在字符串上调用decode_header()函数:
email.Header.decode_header(theString)
现在似乎只是简单地扩展了这个:
email.Header.decode_header(theString.encode('utf-8'))
解决问题
答案 0 :(得分:2)
为了让email.header
模块处理编码并创建一个合适的头,你必须创建一个email.header.Header
的实例,其中包含你的字符串和应该编码的字符集:
>>> h = Header(text, charset)
例如:
>>> t = u'J\xe4rvenp\xe4\xe4'
>>> print t
Järvenpää
>>> from email.header import Header
>>> h = Header(t, 'utf-8')
>>> h
<email.header.Header instance at 0x7fc2636e7950>
>>> print h
=?utf-8?b?SsOkcnZlbnDDpMOk?=
>>> h = Header(t, 'iso-8859-1')
>>> print h
=?iso-8859-1?q?J=E4rvenp=E4=E4?=
字符串可以是 unicode 字符串,也可以是字节字符串。
charset
只会影响标题编码的编码。charset
将确定假定字节字符串的编码方式,以及将使用哪种编码对标头进行编码。如果您提供的字节字符串无法使用charset
进行解码,则会引发异常。答案 1 :(得分:-1)
AFAIK,str()处理ascii,这就是你收到错误的原因。如果您的字符串是unicode,则应该header = unicode(header)
,否则应该先解码。
#!/usr/bin/python
# -*- coding: utf-8 -*-
header = unicode("Järvenpää".decode('UTF-8'))
print header
输出
Järvenpää