email.header 不处理芬兰语字符?
email.header not handling Finnish characters?
某个 Python API returns u'J\xe4rvenp\xe4\xe4'
完成词 Järvenpää。
其中 \xe4 == ä
然后我调用 email.header 将此字段添加到要打印的 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 的顶部
- 在将芬兰语字符串传递给 email.header
之前调用 unicode()
- 在将芬兰语字符串传递给 email.header
之前调用 .encode('utf-8')
None已解决问题。我做错了什么?我想解决方案不会涉及修改 header.py
(核心 Python 模块)。
Python版本:2.7.10
更新:
Header() 没有被直接实例化。相反,我在字符串上调用 decode_header() 函数:
email.Header.decode_header(theString)
现在看来,只需这样扩展即可:
email.Header.decode_header(theString.encode('utf-8'))
解决问题
为了让 email.header
模块为您处理编码并创建适当的 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 字符串或 byte 字符串.
- 如果您使用 unicode 字符串,
charset
只会影响 header 编码 的编码方式。
- 如果您使用字节字符串,
charset
将确定假定字节字符串采用何种编码,以及将使用何种编码对 header 进行编码。如果您提供的字节串无法用 charset
解码,将引发异常。
据我所知,str() 处理 ascii,这就是您收到错误的原因。如果你的字符串是 unicode 你应该做 header = unicode(header)
,如果不是它应该先解码。
#!/usr/bin/python
# -*- coding: utf-8 -*-
header = unicode("Järvenpää".decode('UTF-8'))
print header
输出
Järvenpää
某个 Python API returns u'J\xe4rvenp\xe4\xe4'
完成词 Järvenpää。
其中 \xe4 == ä
然后我调用 email.header 将此字段添加到要打印的 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 的顶部
- 在将芬兰语字符串传递给 email.header 之前调用
- 在将芬兰语字符串传递给 email.header 之前调用
unicode()
.encode('utf-8')
None已解决问题。我做错了什么?我想解决方案不会涉及修改 header.py
(核心 Python 模块)。
Python版本:2.7.10
更新:
Header() 没有被直接实例化。相反,我在字符串上调用 decode_header() 函数:
email.Header.decode_header(theString)
现在看来,只需这样扩展即可:
email.Header.decode_header(theString.encode('utf-8'))
解决问题
为了让 email.header
模块为您处理编码并创建适当的 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 字符串或 byte 字符串.
- 如果您使用 unicode 字符串,
charset
只会影响 header 编码 的编码方式。 - 如果您使用字节字符串,
charset
将确定假定字节字符串采用何种编码,以及将使用何种编码对 header 进行编码。如果您提供的字节串无法用charset
解码,将引发异常。
据我所知,str() 处理 ascii,这就是您收到错误的原因。如果你的字符串是 unicode 你应该做 header = unicode(header)
,如果不是它应该先解码。
#!/usr/bin/python
# -*- coding: utf-8 -*-
header = unicode("Järvenpää".decode('UTF-8'))
print header
输出
Järvenpää