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)

我已经尝试了几件事:

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ää